Стек преполнить можно и на стеклес. На высокой нагрузке всё равно всё будет в потоках работать, а у них стек весьма ограничен, хоть его размер и можно контролировать (но не в std::thread)
1. Фреймы будут выделятся из арены, заранее выделенной. 2. Глубина решается модель азио, когда евент луп вызывает готовые корутины из себя, в итоге глубина стека всегда приверно равная и небольшая
По поводу второго пункта: откуда вы знаете сколько и каких короутин будет создано? У вас есть вызов async_read_coro, но во что он выльется? Где гарантии, что там только одна короутина?