1. Сохрани результат create_task() в переменную (глобальную или атрибут класса бота, если у тебя класс). Иначе со временем сборщик мусора соберёт объект задачи и задача прибьётся.
2. Перед запуском фоновой задачи проверяй, а не запущена ли она уже. Вроде как on_startup() может вызываться неоднократно при некоторых обстоятельствах.
3. При выходе из бота берешь этот объект задачи и делаешь что-то типа
my_bg_task.cancel()
try:
await my_bg_task
except asyncio.CancelledError:
pass
чтобы дать фоновой задаче спокойно завершиться.