I'm totally just guessing here - no real experience in this arena - but you might try running tunnel connection as a child process (or maybe the parent spawns a child to run telnet, and then the parent opens the tunnel? I'm clueless on that).
Anyway it sounds like the program hangs because it's waiting for i/o on one connection, and so cannot do anything on the other. In my limited experience using SSH tunnels (interactively only, never via scripts), the tunnel ssh connection is always running separately (e.g. in another shell) from whatever process is supposed to actually do stuff using the tunnel.