От чего может зависеть, что какие-то функции запускаются с помощью create_task, а какие-то нет?
asyncio.create_task - обернуть корутину (просто объект-генератор, по факту, ты можешь пихать его в next(), можешь дёргать у него .send() и .throw()) в asyncio.Task
Task это уже сложная штука, которая инкапсулирует в себя логику управления корутинами с помощью планирования их в текущем событийном цикле
asyncio.create_task() внутри себя возьмёт действующий луп и просто дёрнет loop.create_task(), то есть тоже самое
asyncio.ensure_future() - на самом деле почти тоже самое. оно из корутины либо asyncio.Future тоже делает таск.
Future - это тоже сложная штука которая инкапсулирует в себе логику асинхронного выполнения. в основном сделана для того чтобы упаковать в себе колбэк-лапшу всяких select