The answer, in this case of using CSOM/c# client side, ends up being a combination of simplifying the XML and relying on post-add CSOM interactions.
In short, the above XML can be simplified to:
var lookupFieldXml = "<Field DisplayName="UserStatus" Type="Lookup" />";
var field = destinationList.Fields.AddFieldAsXml(lookupFieldXml, false, AddFieldOptions.AddToAllContentTypes);
lookupField = context.CastTo<FieldLookup>(field);
lookupField.LookupList = sourceLookupList.Id.ToString();
lookupField.LookupField = "Title";
// at this point, we can update against lookupField or field. It doesn't appear to matter.
field.Update();
context.ExecuteQuery();
A note about this solution - the key piece here is the explicit CastTo operator hanging off of the context. It is not a type-safe cast, you can cast any field to any other type of field and there are no complaints.