Answer
Check the workflow's trigger timing setting — Asynchronous is the only timing option that actually works for a workflow being triggered from a background/scheduled job context; if it's set to a synchronous timing (which assumes an interactive client session), it silently won't fire from a Database Task's batch execution.