При вызове Do() выполняются весь код до первого await-а реального асинхронного вызова, и только тогда отдаётся вызвавший поток. await CalculateAsync не является по настоящему асинхронным, он делает всё синхронно. Если заменить Thread.Sleep(1000) на await Task.Delay() должно начать работать как ожидается.