Как ты сказал, что метод NSURLConnection специально для отправки запроса асинхронной и действует на более высоком уровне абстракции. Значит, для вас под капотом делается много тяжелой работы.
Также, что вы делаете в примере, посылаете вызов блока, который вы будете поставлять асинхронно, но сам блок будет выполнен в основной очереди, что не будет асинхронным.
Вы можете, например, загрузить что-то в фоновом режиме с асинхронным запросом, а затем сделать связанный с UI материал в главной очереди с помощью вызова dispatch_async.
Так сказать: dispatch_async является частью системы НОД довольно низкого уровня, которые могут быть использованы для различных вещей, таких как диспетчерские произвольные CodeBlocks на разных очередях и т.д. See here for reference
Если вы хотите знать погоду он вызывает в основном потоке вы можете распечатать NSThread.isMainThread() внутри обработчика sendAsynchronousRequest – Arbitur