Простого способа нет.
Если оба бота написаны на базе asyncio, то скорее всего их метод run_forever() или эквивалент сводится к вызову asyncio.run(корутина_тело_бота()). Тогда можно будет свести запуск бота к тайой конструкции
async def main():
await asyncio.gather(
корутина_тело_бота1(),
корутина_тело_бота2()
)
if __name__ == '__main__':
asyncio.run(main())
Программа завершится, когда завершатся оба бота.
Но чтобы добраться до "настоящего" тела бота, нужно как минимум зарыться в документацию, а то и почитать исходники библиотеки, в частности, исходники run_forever() (или его аналога).
Не получится просто взять и написать
async def bot1():
bot1.run_forever()
Чудес не бывает.
Есть вариант запустить ботов в разных потоках, и это единственный вариант, если хотя бы один из ботов не асинхронный. Но я бы не советовал. Многопоточные программы имеют целую кучу своих специфических багов, которые могут проявляться не при каждом запуске. Они очень неприятны в отладке.
А уж мешать многопоточность с асинхронностью... тут нужно очень хорошо понимать, как это всё работает.