asyncio.run(main()) крутит рабочий цикл, пока переданная ей корутина не завершится. Если на момент завершения рабочего цикла какие-то корутины были в состоянии ожидания - упс, у них не будет шанса как-то отреагировать на произошедшее. Детали реализации я затрудняюсь пояснить - в частности, почему корутины всё-таки стартуют и успевают дойти до первого await вызова, и только потом умирают. Я где-то читал, что asyncio.sleep() вообще имеет отдельную очередь вызовов, возможно тут, какое-то взаимодействие.
На странице, где получаешь токен бота, тоже соответствующие разрешения проставлены?
И оформляй код, как требуют правила сайта. Кнопка </> в помощь.