Locker Service: Cannot set field values that were null on records from SOQL or SObjectType.newSObject()

You can initialize an empty record at the client side. For example:

<aura:attribute name="contact" type="Contact" default="{'sobjectType': 'Contact'}"/>

<lightning:input label="First Name" value="{!v.contact.FirstName}"/>
<lightning:input label="Last Name" value="{!v.contact.LastName}"/>

<lightning:button onclick="{!c.createItem}">Create</lightning:button>

Component controller:

createItem : function(component, event, helper) {
    var contact = component.get("v.contact");
    var action = component.get("c.createContact");
    action.setParams({
        "myContact": contact,
    });
    action.setCallback(this, function(a) {
        var result = a.getReturnValue();
        component.set("v.contact", result);
    });
    $A.enqueueAction(action);
}

Apex controller:

@AuraEnabled
public static Contact createContact(Contact myContact) {
    insert myContact;
    return myContact;
}

So in your case, if the initial call to your Apex controller doesn't return any record, I would have the Apex controller return null (instead of instantiating and returning an empty object). On callback, your component controller would then assign either the value returned by the Apex controller (if any) or a new empty object if the Apex call returned null. Something like this:

action.setCallback(this, function(a) {
    var contact = a.getReturnValue() || {sobjectType: 'Contact'};
    component.set("v.contact", contact);
});

Salesforce support confirmed that the root cause is same as this Known Issue:

LockerService - New properties added to an object in JavaScript are not visible

Summary
When LockerService is activated new properties added to an object in JavaScript are not visible.

This is being fixed as a part of release 208 which is a summer release scheduled on 22nd April 2017. I am trying to get an early access in our sandbox, will update this space after I test the fix.