Based on the workaround from Cannot set sharingModel to ControlledByParent on a CustomObject without a MasterDetail relationship field:
Add the master-detail lookup field to the deployment (even
if it has not changed) to your deployment selected list.
it looks like the problem is that sfdx fails to push the master-detail relationship field when it doesn't change.
Until sfdx is fixed to address this, a simple workaround is to manually change e.g. the
label of the master-detail field so it does get pushed at the same time as the other changes:
<?xml version="1.0" encoding="UTF-8"?>
and try hard to remember to change it back to the correct value straight after and do another push...
If you have a better solution please post an answer and I will accept it.