В-нулевых: revealing module сильно устарел на данный момент, пора юзать настоящие модули, лучше всего — ES2015.
Во-первых, как правильно отметил
Алексей Уколов, чтобы явно указать зависимости и предотвратить конфликты.
Во-вторых, чтобы вместо jQuery можно было передать, например, Zepto, а вместо window — какой-то другой скоуп, например, в nodejs нет window.
В-третьих, это дает возможность минификатору сжать внутри этой функции window (и остальные аргументы) до одной буквы.
Что же до undefined, то в sloppy-режиме (без 'use strict') можно переопределить undefined, как будто это простая переменная. Чтобы получить настоящий, неиспорченный undefined в функцию не передают один аргумент, непереданный аргумент по дефолту имеет значение undefined. Вот такие ужасы можно творить:
(function () {
var undefined = 'wtf';
console.log(undefined);
}())