Thank you @mrshenli for your answer!
Indeed, the slower run time was caused entirely by the overhead of the ProcessPoolExecutor.  It is interesting that this context has implications also for non-asynchronous procedure calls. I measured the entire program again with longer-running tasks and the overhead of the  ProcessPoolExecutor seemed to be constant but the latency of data loading could be hid below the optimize call.
Again, thank you for your reply - It helped me a lot!