Не работает, потому что к тому времени, когда функция onclick будет вызвана, переменная i дойдет до самого конца цикла. И будет использоваться именно это, последнее значение.
В первом варианте переменная i используется в конкретной итерации, т.е. берется photos[i] и это значение дальше передаётся, а сама переменная i больше не используется, так что в целом пофиг, как там она дальше будет изменяться.
Ведь в первом варианте вызов
addThumbnailClickHandler(thumbnails[i], photos[i])
происходит прямо в цикле, сразу, без промедлений, а не откладывается на потом. В этот момент конкретные значения передаются в качестве параметров. И далее из-за замыкания они так и остаются висеть в памяти и ссылаться на то, что нужно.
Немного изменим код, и он снова перестанет работать :)
var i;
var addThumbnailClickHandler = function (thumbnail) {
thumbnail.addEventListener('click', function () {
fullPhoto.src = photos[i]; // i === thumbnails.length
});
};
for (i = 0; i < thumbnails.length; i++) {
addThumbnailClickHandler(thumbnails[i]);
}