Mystery solved. I had originally meant to post the original message last night, but it say in my list of things to do...
The problem was that the data to be sent was being passed along as a pointer. The CAN data was being stored in an array of structs at file scope level, but copied to a function scope array before being sent through the USB stack.
The USB stack didn't send the data straight away, and so the function scoped array memory location was no longer used to hold the data upon leaving the function. Setting the intermediate array as static solved the issue.