You have a stable version of code available and are continuing development on a new version. Someone reports a bug in the stable version that you would like to fix and release without releasing all your new (and possibly unstable) changes.
You would like to try out some changes that may be be disruptive to the rest of the code. You would like to test them independently of the main code base and then (perhaps) merge them in with the main code once they have been debugged.
Branches do not have to be merged back in to the main development stream. You can simply have dead branches. (Example: Someone finds a typo in an old version of a manual. You branch the files, fix and release the change. In the meantime, you have changed the text in the new version and so this change will never need to be incorporated.)