Потому-что, как я писал вышел, coroutineScope { ... } дает гарантию что после завершения функции ничего не утекло
То есть правило такое:
Если мы хотим, чтобы после завершения функции у нас в памяти продолжала висеть корутина, например, с подиской на канал, то правильнее (с точки зрения api класса и избежания лишнего расхода памяти) передать сам скоуп в эту функции и оставить её как не-suspend.
Если мы хотим, чтобы по завершению нашей функции ресурсы сразу освободились, то правильнее (опять же с точки зрения api и избежания лишнего расхода памяти) пометить функцию как suspend, а уже внутри неё использовать coroutineContext { launch { } }.