Разница в ваших двух примерах заключается в том, что один создает изображения через API изображений, а другой - конкатенацию строк.
Чтобы дождаться загрузки всех изображений, нужно установить условие, которое проверяет, все ли они были созданы.
var html = '';
data.forEach(function (item, index) {
if( data[index] !== -1){
html += '<img src="' + item.src + '">';
} else {
$('.container').append(html);
}
}