Let me clarify, I expect that all of magic should happend calling the org.activiti.engine.TaskService#complete(String taskId, Map<String, Object> variables, false).
@param localScope If true, the provided variables will be stored task-local, instead of process instance wide (which is the default for {@link #complete(String, Map)}).
So, as stated before if an embedded subprocess shares the same variable context with parent process, and we set localScope to false, then this call should propagate the processVariables up to the parent process.