Ext.data.operation.Operation.doProcess has such fragment:
Code:
else {            // Either no serverRecords or no clientIdProperty, so index correspondence is
            // all we have to go on. If there is no serverRecord at a given index we just
            // commit() the record.
            for (i = 0; i < clientLen; ++i) {
                clientRecord = clientRecords[i];


                if (serverLen === 0 || !(serverRecord = serverRecords[i])) {
                    // once i > serverLen then serverRecords[i] will be undefined...
                    clientRecord.commit();
                } else {
                    clientRecord.set(serverRecord, commitSetOptions);
                }
            }
        }
serverRecord is Model, but Model.set expects object, not Model. To be precize Model.set has such code:
Code:
if (single) {            values = me._singleProp;
            values[fieldName] = newValue;
        } else {
            values = fieldName;
        }
and then

Code:
for (name in values) {
so it definitely expects object with values to set, not Model/Record.

If replace
Code:
clientRecord.set(serverRecord, commitSetOptions);
by
Code:
clientRecord.set(serverRecord.data, commitSetOptions);
everything gets fine, record is updated by data, returned by server.
Hope this helps.