(which can be relatively large if the variable is a large instance of a type)
I think you're wrong here, I'm pretty sure that type instances are always passed by reference, and other variables are passed by value.
Because if you do Type_Var.MyType=New MyType and then pass this on to a function, and change one of its fields there, it will have changed outside the function as well.
So maybe you could have types byRefString, byRefInt and byRefFloat which each contain one field, and pass those to your functions in order to mimic byref?