Getting variables from a process-instance always requires a call to the runtimeService. When you're inside activiti-context (eg. JavaDelegate in service-task or DelegateExecution in task/execution-listeners) you can fetch the variables from the DelegateExecution. You should, for example, add a execution listener on process-end and write the variables to some kind of distributed cache in this listener. The listener will be called RIGHT BEFORE the process ends. However, this only works for processes that have been complete while the cache was running.
Don't really see why a call to the DB should be a problem for completed processes?