If you look at the code, you'll see it's a one-liner:
return self.parent()([a.subs(in_dict, **kwds) for a in self.list()])
So it does the substitution on the elements and then forces the result back into the parent, which is FreeModule(R,3). Your ring T has a conversion back into R because both are polynomial rings in 3 variables over QQ. If you change your codomain to `T.<t,t0,t1,t2>` you'll see an error that shows what's going on.
So the code is definitely doing what it is programmed to do. I think it's more designed to work with modules over the Symbolic ring, though. You could look into the revision history with "blame" to see if it ever did anything else. I suspect you recall it working according to your intent when used over SR (where it would work).
The problem with giving the result back that you probably intend is that `subs` would somehow have to figure out you want the answer to lie in `FreeModule(T,3)` and construct that parent.