It doesn't work because when you're passing t2.call, you're actually just passing .call. In other words, it doesn't remember the object from which it was passed.
To accomplish what you wanted, you can use .bind().
t1(t2.call.bind(t2))
This binds the t2 function as the this value of .call, which means you'll be calling .call as though you had done this:
t2.call
...which is what you wanted.
The .bind method is not supported in IE8 and lower, as well as some other older browsers, but you can implement a mostly complete shim in those cases.
FYI, if you need this a lot, you could bind .call as the calling context of .bind to shorten it a bit.
var callBind = Function.prototype.bind.bind(Function.prototype.call);
So now you have a .bind() function with .call() bound as its calling context. When you invoke it, it will be as if you were doing this:
.call.bind(/* the function */)
So callBind() will return a function with the function bound as the calling context of .call, just like we did above. So you'd use it like this:
t1(callBind(t2))