Yeah, if we really want to have mulitple threads, then we can only use database.
But it seems that some of them are not, such as Apache ODE Jacob.
Via Jacob, ODE represents the state of a BPEL process as a collection of objects (for lack of a more precise term) connected by channels for passing messages. In this context, a message is a lightweight, internal message -- just a Java type -- not the heavier WSDL messages that the engine sends and receives externally. When an object receives a message, it can create new channels and objects and send messages; concurrency is managed by consuming messages in a single-threaded fashion (on a per-process-instance basis).
It is from "http://www.infoq.com/articles/paul-brown-ode"
It seems jBPM also works this way, not sure at the moment, but it is a way that we can think about it.
jBPM does everything through the database too.
I haven't looked at ODE for quite a while, but they're still using a single manager for the context. Whether that's maintained in the database or via some central service is really just an implementation issue (though persistence will still be needed in the latter case if we're to tolerate failures).