It looks like you cannot do that for any Object's whose OwnerId field has its namePointing value set to true. The namePointing indicates that the Owner field can be polymorphic (e.g., Lookup(User,Queue)). The technical documentation on the namePointing attribute is:
Indicates whether the field's value is the Name of the parent of this object (true) or not (false). Used for objects whose parents may be more than one type of object, for example a task may have an account or a contact as a parent.
The Name object documentation is:
This object is used to retrieve information from related records where the related record may be from more than one object type (a polymorphic foreign key). For example, the owner of a case can be either a user or a group (queue). This object allows retrieval of the owner name, whether the owner is a user or a group (queue). You can use a describe call to access the information about parents for an object, or you can use the who, what, or owner fields (depending on the object) in SOQL queries. This object cannot be directly accessed.
Knowing this, it makes sense that it would not be writeable, because you would be assigning a User to a Name object.
It appears that you can query the User record and then assign it directly to the Owner field on the Object that has the OwnerId field and namePointing false (such as Account and Contact). At that point, it will be available in memory. Note that if you insert/update the record that has the Owner value set, the Owner value will go away, and you'll have to query it back out.
Here is an example that uses Account:
User u = [Select Id, Email From User];
Account acct = new Account(Name = 'Test', Owner = u, OwnerId = u.Id);