Проще всего через наследование. Просто кладете дефолтный объект в прототип и пихаете свои значения сверху. 
Второй способ - рекурсивно.
//Тестовые данные
var defaults = {
    test1: true,
    test2: true,
    test3: {
        "test3.1": true,
        "test3.2": true
    }
};
var params = {
    test2: false,
    test3: {
        "test3.2": false
    }
};
//Сама маржилка
var result = (function (defaults, param) {
    var obj = Object.create(defaults);
    var merge = function (result, params) {
        for (var key in params) {
            if (params.hasOwnProperty(key)) {
                if (key in result && typeof params[key] == "object" && typeof result[key] == "object") {
                    merge(result[key], params[key])
                } else {
                    result[key] = params[key];
                }
            }
        }
    };
    merge(obj, params);
    return obj;
})(defaults, params);
//проверяем
alert(result.test1);
alert(result.test2);
alert(result.test3["test3.1"]);
alert(result.test3["test3.2"]);