行儀悪いけどこうやれば3秒後にループから抜けられるよ。

__block bool done = false;

dispatch_async(
 dispatch_get_global_queue(
  DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
  ^{ sleep(3); done = true; });

while (!done) {}