TRANSFER is, as far as I can tell, only usable for blind transfers. The other problem with it, at least when used after Asterisk has answered the call, is that it returns a success status to the dial plan as soon as it has queued sending the refer, and things get confused if the refer is actually rejected. <http://bugs.digium.com/view.php?id=12713
However I did get it to work, albeit that the phone used Asterisk to proxy the new call, and another PABX ignored the IP address part. I might not have used a complex enough case for your problem.
I wonder if your problem is that you should be using URIENCODE(), in the dial plan.
If not and you can demonstrate a case where it violates the SIP protocol specification, and you are using an unpatched recent Asterisk 1.4, or 1.6, I think that would justify a bug report on bugs.digium.com. Include the dialplan fragment and relevant protocol traces, preferably using "sip set debug", and state what you believe should be sent and where that is specified.
You cannot use the bug reporting mechanism to report functionality that you think should be there, but you can, and should use it to report functionality that is there but violates the relevant specification.