Сначала срабатывает выражение в скобках, а так как this === window, то this.x === window.x, следовательно мы не объявляем переменную, а присваиванием x для window. Скобки возвращают undefined, точнее, результат выполнения console.log, и этот результат (undefined) мы записываем уже в созданный ранее x.
'use strict';
x = null;
function x() {}
console.log(x);
'use strict';
x = (function() {
this.x = null;
}.call(this), {
foo: 'bar'
});
console.log(x.foo); //bar