That was it! Using the spring.task.execution.pool.* properties instead of the flowable.process.async.executor.* properties fixed the issue immediately.
Because the default Spring queue-capacity was Integer.MAX_VALUE, Node 1 was indeed hoarding every job. Once I limited the Spring queue capacity, the unacquireJobAfterRejection logic triggered perfectly, and Node 2 started picking up the excess load.
As a followup topic, it would be better to update documents like Advanced · Flowable Open Source Documentation about how spring parameters are used.
Thank you again for helping me to understand this better.
Regards,
Roy