I can't help you just want to say that I've noticed the same. The variable obtained via getVariable seems to be only a copy.
I guess this is intended...
I wonder how I can use the real references, my concerns is that those copies take time and influence performance.
One sulotion is to use transient variables instead of normal variables that I guess, because of the persistency nature of jBPM, hold a copy.
Transient variables will always get the object reference.
If you don't need the DB, transient variables can work.