Като маркираш метод с async това не го прави асинхронен. Само му позволява да използва await(и вкарва резултата или exception-а с Task).
Ако имаш метод с async, който не изчаква никакви асинхронни операции в него, то той е напълно синхронен и ще се изпълни от нишката,която го извиква.
Това,което пропускаш, най-вероятно е, че не използването на await кара метода да работи асинхронно, а използването на await върху незавършени Task-ове. Когато Task-ът е завършен,няма причина да спираш метода. Просто можеш да си вземеш резултата и да продължиш синхронно.
В твоя случай Level2 работи синхронно. Когато Level1 е готов да изчаква задачата си, тя вече е приключила и затова Level2 продължава синхронно. Не забравяй, че изчакваш Task,а не метод, и кодът ти всъщнос работи така:
public static async Task<bool> Level1()
{
var $task = Level2(); // Върви синхронно
var t = await $task; // изчаква завършен Task
Console.WriteLine("L1 done.");
return t;
}