При создании задачи при помощи asyncio.create_task она немедленно (при ближайшем переключении контекста, например при встрече await) начинает выполняться в цикле событий. Именно поэтому у тебя в первом примере сразу же стартанули все указанные задачи.
await же, указанный в твоем коде, позволяет ожидать завершения задачи. Поэтому в твоем коде второго примера ты создаешь задачу, ждешь её выполнения и только потом переходишь к следующей:
async def main():
tasks = []
for _ in range(10):
task = asyncio.create_task(waste_time()) # создаем задачу
tasks.append(task)
await task # ожидаем выполнения
# итерация завершена, переходим к следующей
Если хочется запустить сразу все задачи, то тут было бы правильнее воспользоваться asyncio.gather, которая как раз будет ожидать выполнения всех задач:
import asyncio
from time import time, sleep
async def waste_time():
print("Start work...")
await asyncio.sleep(2)
print("End work!")
async def main():
tasks = []
for _ in range(10):
task = asyncio.create_task(waste_time())
tasks.append(task)
await asyncio.gather(*tasks)
asyncio.run(main())