I finally figured out a solution and I am posting it here in case someone else faces this issue. As I had suspected in my original post, this turned out to be an Arduino issue and to a lesser extent a Windows thing. In Arduino when you create a custom characteristic you can choose the option to read/write/notify/indicate. These are the standard 4 characteristic properties. There is also another property 'BLEWriteWithoutResponse', which hasn't been discussed a lot on forums. And it is this property that needs to used in your Arduino Nano33 BLE sketch.
The difference between BLEWrite and BLEWriteWithoutResponse is that the latter doesn't expect an acknowledgement or approval for MATLAB's request to write to the characteristic. If your Arduino is setup to send acknowledgements in response to Write request, then BLEWrite will work too (I think, but I haven't tried this). Now, the other weird thing is (which is why I said its a Windows thing), it didn't matter on a MAC computer whether the Arduino was configured with BLEWrite or BLEWriteWithoutResponse. It worked perfectly well on a MAC computer running MATLAB. But, on a Windows machine, it did make a difference.
Finally, here is a snippet of my Arduino sketch, just to show clearly how the custom characteristic must be setup -
#include <ArduinoBLE.h>
#include <Arduino_LSM9DS1.h> // 9 axis IMU on Nano 33 BLE Sense board
// BLE Service
BLEService imuService("917649A0-D98E-11E5-9EEC-0002A5D5C51B"); // Custom UUID
// Matlab writes to this characteristic:
BLEByteCharacteristic WriteChar("917649A1-D98E-11E5-9EEC-0002A5D5C51C", BLERead | BLEWriteWithoutResponse);
void setup(){
...}
void loop(){
...}