The completed event has WorkflowApplicationCompletedEventArgs that contains the dictionary of the OutArguments of the workflow instance’s root activity, keyed by argument name.
So you could keep populating the OutArguments as your workflow progresses and when it Completes, access the dictionary and hence the OutArguments.
Setup delegate
WorkflowApplication.Completed = ApplicationCompleted;
Method called on Completed
private void WatcherApplicationCompleted(WorkflowApplicationCompletedEventArgs e)
{
e.Outputs; // <---Output dictionary
}