In case any one else is looking at this thread, I want to make sure they realize what was happening here.
The fsl_flexcan driver in MQX 4.1 has a bug: the interrupt happens when the message comes in, but it doesn't copy out the message before it clears the interrupt. When the driver reads out the message later, it always seems like you're queue-length messages behind.
This has been fixed in Kinetis SDK 1.1.0, but I don't know how that applies to the straight MQX distributions.