проще думать о корутине как о некотором функциональном объекте который выделен в куче. Просто в коде корутины ты пишешь x = 7; , а работает это как coroPtr->x = 7
Добавлю что в stackless (которые в стандарте) это как раз не так и они используют стэк потока который запустил или продолжил исполнение корутины. В activation frame корутины попадают только автоматические переменные, которым нужно пережить suspend корутины. Поэтому они вместо килобайт используемых stackful, stackless корутины могут обходится десятками байт.