Ну вот и ответ. Асинхронный клиент, чаще всего, под капотом имеет некий observer, который и ожидает пока не получит результат и берет на себя всю ответственность за получение результата (положительный или отрицательный с точки зрения логики, а не ответа от сервера что он слишком занят). Мне нравиться этот пример разбирать больше со стороны сервера.
Например, Webflux. Создай 2 endpoint'а - один обычный, а другой заверни в Flux или Mono. Включи дебаг и поставь breakpoint чтобы залочить выполнение. Далее, отправь запрос с Postman или SoupUI и увидишь разницу. В первом случае - ты отвалишься через определенный timeout с 504 в своем клиенте, но backend так и будет работать дальше. Во втором - неблокирующие очереди берут своё и ты будешь висеть до тех пор, пока backend не обработает твою операцию.