т.е. в loop сейчас ничего нет, из неё происходит чтение, поэтому выполняется горутина, а мейн дальше не идет?
Мейн это тоже горутина. Если горутине нужно читать из канала, а там (пока) ничего нет, то она блокируется и ждёт, а в это время могу выполняться другие. Они и так могли бы, но main особенная тем, что если она завершается -- всё завершается, не дожидаясь окончания. Можно было бы time.Sleep(100500*time.Second) с почти тем же успехом для тестового кода поставить