I got quite a nice solution working.
I spawn a load of objects randomly, then at the start of the next tick, a While loop runs until the overlap count is zero. In the while loop positions are randomised, and the overlap check is performed and overlaps counted. A|t the top of the While loop, the overlap count is reset to zero. When it hits zero, the loop is exited.
To avoid having infinite loops when there are a lot of objects, I count the iterations in the While loop. Every 100 iterations of randomly placing objects, I randomly remove one Balloon sprite, reset the iteration counter and continue with the process. This way I start with a large number of objects, and degrade slowly to ensure an end condition. At any point I may get lucky and the randomisation avoids overlap and I keep a large number of objects.
I did notice that you cannot destroy objects in a While loop it seems, and not process them on the next iteration. Instead I mark them as "dispose", and ensure my overlap check ignores anything marked "dispose" by reselecting the instances at the top of each While loop iteration, and when the While loop exits....I destroy any sprites marked for "dispose"....simples ;-)