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