The next hop self feature is used primarily for this purpose, to allow iBGP routers to change the next hop IP address in order avoid potential reachability issues.
A slightly different scenario that comes to mind where BGP next hop self is used is when you have two internet routers running eBGP with their ISPs and iBGP between them. If the next hop self command is not implemented, then each iBGP neighbour will have the eBGP ISP as the next hop for some networks, something that you may not want for your network. The principle is the same, the scenario is somewhat different.
Best practice for using next hop self is to use it whenever an internal peer must see the iBGP peer as the next hop rather than the eBGP peer to which it may not have a route. Now you could have an IGP provide the route to that peer, however, because it is outside of the AS, it is not ideal. IGPs should function only within an AS and have only BGP operate on an interAS basis.
I hope this has been helpful!