Да, из-за асинхронного вызова
Можно было бы метод StartAsync сделать ValueTask и проверять в начале что он уже запущен, по типу такого
var connection = _connectionLazy.Value;
await connection.StartAsync();
А внутри StartAsync:
if (Interlocked.Exchange(ref _startedFlag, 1) == 1)
return;
await DoSomethingForStart();