As stated in Model.save documentation:
save model.save([attributes], [options])
  [...] The attributes hash (as in set) should contain the attributes you'd like to change —
  keys that aren't mentioned won't be altered — but, a complete
  representation of the resource will be sent to the server.
You can however override the save method and provide a data attribute via the options which will be sent to the server instead of the full model representation. For example, this will only save the attributes passed to the method :
var M = Backbone.Model.extend({   
    save: function (attrs, options) {
        options || (options = {});
        options.contentType = 'application/json';
        options.data = JSON.stringify(attrs);
        Backbone.Model.prototype.save.call(this, attrs, options);
    }
});
And a Fiddle http://jsfiddle.net/dLFgD/
As @mikebridge noted in the comments, this behavior can now be obtained by passing an attrs option. So either use
book.save(null, {
    attrs: {author: "Teddy"}
});
or keep the override
var M = Backbone.Model.extend({
    url: '/echo/json/',
    save: function(attrs, options) {
        options || (options = {});      
        options.attrs = attrs;
        Backbone.Model.prototype.save.call(this, attrs, options);
    }
});
http://jsfiddle.net/nikoshr/dLFgD/7/
You could also send a PATCH request if you're using a Backbone version that supports it (>=0.9.9) and your server understands that verb,  as explained in @pkyeck's answer