When using a connection string with "Connect Timeout=0", the Connection Pool fails when opening multiple simultaneous connections (ie..in Thread Pool). The documentation suggests that a value of 0 means an infinite timeout period. When removing the value or making it nonzero, the connection pool behaves as expected.
I suspect that the value of 0 is passed to an AutoResetEvent or a Win32 call (WaitForMultipleObjectsEx) which use 0 as the value to not wait at all (check handle and return immediately).
The use of System.Transactions appears to aggrevate the issue.
(Note: Control panel is showing my version of the 2.0 framework as 2.0.50727.42).
If this is by design, it's an unexpected change in behavior from the ODBC api:
You can check the documentation for the SQL_ATTR_CONNECTION_TIMEOUT and SQL_ATTR_LOGIN_TIMEOUT attributes.