I am answering my own question after speaking to Matlab support so that it may be useful to others:
1. While I was recommended to disable the local MPI using
distcomp.feature('LocalUseMpiexec', false)
my problem was actually caused by a LM_LICENSE_FILE environment variable (source, this StackExchange. Deleting the variable fixes the problem, but this will of course prevent other software that depend on it from running.
2. There seem to be no way to exchange information between the client matlab and a worker, except of course at the beginning and at the end of the execution of the job. From Matlab support:
"All the workers will have their local copies of the variables defined in the client. If you want to send handle objects to the body of a parfor-loop, you need to explicitly assign the modified handle objects to the output variables of the parfor-loop."
3. From Matlab support:
"I am afraid that currently there is no way to define a callback function during a worker's execution. A possible workaround is that you can use a timer event callback on the client that will be fired at some regular intervals and the callback keeps polling the status of the job. The state of a job can be one of the following: pending, queued, running, finished, and failed."