Reading this, I think the current behavior is a bug – async job run should be fully async.
So, I would go further and say a slightly modified #1 proposal is the right behavior – no need for a scheduler’s attribute (there is already an async run switch, isn’t there?). I also think that a reasonable expectation for a well written runjob hook is that it will delay any jobs it rejects (e.g., by putting them on hold or setting a “run after time X” on them), so #3 is basically taken care of already (by a well written hook).
And… great speedup – cool!