Как работает именованный аргумент функции в JS?
вы передаете не options в console.log(), а совершенно другой объект.
вот так туда попадет options
console.log(show(options));
options, которым даёте значение в начале, и options внутри функции – это две разные штуки. Разберитесь с «областью видимости» переменных в JavaScript. Внутри функции как бы объявляется собственная версия переменной options, значение которой передаётся в функцию при её вызове.
Для читаемости назовите аргумент функции иначе, например, opts – и всё встанет на свои места: options = {
    width: 10,
    height: 20,
    contents: 'some text'
};

function show(opts) {
    var width = opts.width || "";
    var height = opts.height || "";
    var contents = opts.contents || "Предупреждение";
    return width + height + contents;
}

console.log(show( options)); // 30some text
options.contents = 'Другой текст';
console.log(show( options)); // 30Другой текст
p.s. почему "30", а не "1020"? Берётся число 10, к нему прибавляется число 20, результат – число. Потом к числу прибавляется строка, тут уже действует сложение строк (конкатенация). Чтобы с самого начала складывались строки начните с пустой строки: '' + width + height + contents