When an activity is marked as "async", the execution halts and the process-state is persisted. Next, the job is picked up by the job-executor and executes the "async" activity and all activities after it until a wait-state is reached, end is reached or another async-activity is reached.
You could, for example, disable the jobExecutor on machine1 and enable it only on machine2. All asynchronous activities are always executed on machine2. When you put receiveTasks of user tasks after the async-activities, machine1 can then see these tasks and complete them to continue execution of the process on machine1.
However, if you want to have a more flexible system, you should create you're own solution with some kind of queuing, combined with receive-task/signal mechanism to indicate the work on machine2 is finished.