JavaScrypt, как известно, не блокирует, поэтому лучший способ в этом случае - установить обратные вызовы, если вы хотите ждать, чтобы что-то сделать после чего-то.
$(function(){
var main_image = $("#main_image");
$('.under_box').on('click', function(){
var main_source=$(this).attr("src");
main_image.fadeTo(300,0, function(){
main_image.attr("src",main_source);
main_image.fadeTo(500,1);
});
});
});
Также обратите внимание, что вы должны уменьшить свои переходысохраняя этот способ в DOM,
var $main_image = $("#main_image");
будет хранить в памяти объект jquery, а не извлекать его все время.