На стороне сервера важно разрешить параллельную обработку клиентов. Если вы обрабатываете большой запрос для одного клиента, вы не хотите, чтобы время ожидания запроса на подключение второго клиента истекло. Это не означает, что у вас есть для использования асинхронных методов. Вы можете легко создать отдельный поток для каждого подключенного клиента и принимать новых клиентов в основном потоке синхронно (а для Udp вы можете использовать очередь обработки каждого сообщения в потоке из ThreadPool).
Асинхронные методы сокетов уже позаботятся о параллельности (также используя отдельные потоки), так что это хорошая техника для обеспечения бесперебойной работы вашего сервера.