A cluster is essentially a C-style struct, so its "type" will depend upon what is in it. However, a wire branch does not automatically signal a data copy. The LabVIEW compiler tries its best to determine what data can and can not be used while maintaining data flow and only copies when it thinks it needs to. This is the in-placeness Ben mentioned earlier. You can get a good idea of where copies are being made by clicking on Tools»Profile»Show Buffer Allocations... Your code needs to be compiled for this to work (hold down the CTRL key and click the run button to compile without saving). The dots shown are conservative and do not always mean a copy will be made at each run. For example, LabVIEW reuses memory in loops. The unwired default input values of subVIs in a loop are only allocated once.
The end result of all this is that you can write deterministic code, you just need to be sure that LabVIEW's automatic memory handling, which was designed for general use, does not get in the way. The thread Ben mentioned above will get you moving in the right direction.