Não há nada de mágico aqui, você recebe o erro porque a conexão que você está usando ao inserir CompanyAddress não é aquela que você pensa que é.
É uma nova conexão. Quando a inserção ComapnyPaymentInfo é executada, você está usando a conexão que já está vinculada à sua transação. Está pendente de novos comandos porque você esperou na etapa anterior.
O uso de Task.WhenAll(), por outro lado, tentará usar vários threads. Se uma conexão estiver ocupada executando um comando, ela não será usada e uma nova será gerada.
Lembre-se que ao usar Transações, você tem apenas uma conexão disponível, você não pode se beneficiar do paralelismo.