При использовании одного потока с асинхронной обработкой будет задействовано только одно ядро процессора. При использвании потока на каждый запрос большие дополнительные расходы на создание потоков. Отсюда:
1. Если каждый запрос требует серьезной обработки и грузит процессор - используйте потоки.
2. Если запросы частые, но обработки не требует - используйте асинхронность.
3. Если у вас действительно высокие нагрузки и нужно максимально эффективно использовать ресурсы - используйте приложение с несколькими заранее запущенными потоками (worker'ами) и в каждом из них используйте асинхронность, распределяйте запросы равномерно между воркерами. Количество воркеров должно быть не меньше, чем количество ядер.
P.S. при исользовании любого подхода кроме один запрос - один поток, асинхронность должна быть не только на сокетах, все операции (например работа с файлами) должна быть асинхронными, чтобы не приводить к блокировке потока.