That generally makes it harder to follow and harder to optimise?
Quite the opposite IMO: it gives a name to the computation and simplifies the control flow by making the computation more functional.
Well then you'll need double-returning, which isn't generally available. One could use longjmp I suppose.
In a high level language, yes, you should probably refactor code that looks like that. In C, no--just write the nested loop that iterates the pointers over the array, and use break or goto.