Мне честно говоря, полная асинхронность кажется лукавством, просто потому что бизнес-логика более-менее сложного процесса обычно довольно линейная. Да, можно какие-то простые вещи готовить и отдавать клиенту асинхронно, какие-то независящие друг от друга операции паралеллить, но в конечном итоге на более-менее сложной бизнес-логике в тру-асинхронном подходе ты просто получишь unmaintainable callback hell. Поэтому асинхронным мы стараемся делать то, от асинхронности чего есть явный понятный профит — как например, сетевые соединения обслуживать, или большие наборы данных отдавать. В случае с бизнес-логикой поддерживаемость и понятность кода куда важнее. (И тестируемость! вы пробовали тестировать асинхронщину?))
Смотря что понимать под асинхронщиной.
Если говорить о классическом libevent style коде с пачкой колбэков, то, конечно, сложность его поддержки должна быть оправдана. Это действительно адок.
А если язык/библиотеки/фреймворк позволяют с ней работать так же легко, как и с синхронным кодом, то не вижу вообще никакой разницы - при этом имеется весь профит от мультиплексирования.
Если брать за пример современный JS или Typescript, то вся асинхронщина изолируется в асинхронных функциях, на уровне инфраструктуры и http-слоя. Работа с асинхронным кодом в асинхронных функциях выглядит ровно так же, как и с синхронным - просто добавляется "магическое" ключевое слово await. Ну и, конечно, там где-то есть return new Promise, но это все в 99% случаев исходит изнутри библиотек (датамаппера, сетевого клиента итд), вручную почти никогда не надо писать. При этом если в каком-то месте надо действительно распараллелить - именно в этом месте уже можно поработать с пачкой promise-ов и опять же свести к return promise, на который выше будет await. В общем, в том же nestjs код практически не отличается от обычного синхронного - просто добавь async / await. (UPD: с тестами - ровно так же. async ... expect(await foo()).toBe(bar)).
Слой domain model при этом, разумеется, синхронный - в нем ведь нет никакого io, зачем это там? Проблемы тут будут, только если использовать паттерн ActiveRecord, или иным образом смешивать domain layer с инфраструктурой. А не надо так делать.
Еще может быть проблема с интенсивными cpu операциями, с тяжелыми вычислениями. Но это крайне редкий случай, тут с любым подходом будут свои проблемы, которые сами по себе не решаются вне зависимости от.