Um aplicativo .NET deve se auto-limpar quando o coletor de lixo for executado no servidor de aplicativos. Isso deve ser executado automaticamente a cada poucos minutos.
Você pode consultar o SQL Server e ver se essas conexões ainda estão abertas no SQL Server?
Se você executar o netstat no servidor de aplicativos, poderá ver todas as conexões de soquete abertas? (Cada spid sendo usado no SQL Server terá uma conexão de soquete no servidor de aplicativos).
Se você vir todas as portas em uso no servidor de aplicativos, o servidor de aplicativos definitivamente não fechará as conexões, pois o SQL não fecha as conexões, a menos que seja solicitado. O código .NET pode estar esperando que isso aconteça automaticamente, e não é. Você provavelmente não tem o problema em seu ambiente de teste porque o uso é muito menor, e você provavelmente libera o ambiente de teste com mais frequência, o que faz com que todas as portas sejam fechadas quando o IIS for reiniciado.
Isso definitivamente soa como um problema de código de aplicativo para mim.