Hello @Steven Drake ,
the IoTHubDeviceClient.on_message_received is used to receive cloud messages.
Cloud messages are stored in a queue on the IoT Hub as long as the device is not connected.
Once the device connects the messages in the queue are then sent to the device.
The Cloud messages mechanism only supports sending messages to the device, there is no response mechanism added. It's like 'fire and forget' but asynchronous.
The proper way to respond is to make use of the reported properties part of the DeviceTwin and put a response value in there.
So you are good to go.
The only thing you need to know is that reported property updates are charged.
If the response helped, do "Accept Answer". If it doesn't work, please let us know the progress. All community members with similar issues will benefit by doing so. Your contribution is highly appreciated.