I just tested your code, the outputs are listed below:
# {A, G, M} Enbl: 1, 0, 0
# {A, G, M} read: 440, 0, 0
Meas. ODR (A,G,M): 88.00, 0.00, 0.00
Spec. ODR (A,G,M): 99.84, 99.84, 10.00
# {A, G, M} Enbl: 1, 1, 0
# {A, G, M} read: 476, 476, 0
Meas. ODR (A,G,M): 95.20, 95.20, 0.00
Spec. ODR (A,G,M): 99.84, 99.84, 10.00
From my understanding, the most possible reason is the usage of multiple "data available". If you want to have all the data synchronized, maybe it is necessary to wait until all the data are available, rather than only acceleration. And then read all of them, not only reading one sensor. However, such design can't gurantee that all the sensors are exactly synchronized especially when you have sensors with different sample rates.
In conclusion, I would like to say it is hard to achieve exactly the same sample rate at least on Arduino. Close to the specified sample rate is good enough.
I am working on a similar project at Nano BLE Sense Rev2 IMU sampling rate - Nano Family / Nano 33 BLE Sense - Arduino Forum, we can keep updated if you are still interested in Sense Rev2.
Good luck!