サポートしているOSのバージョンによって異なります。ドキュメントによると、完了ハンドラ ブロックは NSOperationQueue で実行されます。
+(void)sendAsynchronousRequest:(NSURLRequest *)request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handler NS_AVAILABLE(10_7, 5_0);
NSOperationQueueドキュメントの数行下に、次の引用が表示されます。
通常、オペレーション キューは、オペレーションの実行に使用されるスレッドを提供します。OS X v10.6 以降では、オペレーション キューは libdispatch ライブラリ (グランド セントラル ディスパッチとも呼ばれます) を使用してオペレーションの実行を開始します。その結果、同時操作または非同時操作として指定されているかどうかに関係なく、操作は常に別のスレッドで実行されます。ただし、OS X v10.5 では、操作は isConcurrent メソッドが NO を返す場合にのみ、別のスレッドで実行されます。そのメソッドが YES を返す場合、操作オブジェクトは独自のスレッドを作成する (または何らかの非同期操作を開始する) ことが期待されます。キューはスレッドを提供しません。
注: iOS 4 以降では、操作キューは Grand Central Dispatch を使用して操作を実行します。iOS 4 より前では、非同時操作用に個別のスレッドを作成し、現在のスレッドから同時操作を起動します。同時操作と非同時操作の違いとその実行方法については、NSOperation クラス リファレンスを参照してください。
アプリが OSX v10.6 以降をサポートしている場合は、完了ハンドラーを別のスレッドで実行する必要があります。OS X v10.5 では、指定する必要があります。iOS の場合も GCD を使用しているため、iOS 4 以降では操作も別のスレッドで実行されます。それがトミーの反応よりも明確であることを願っています。