Честно говоря, не понимаю, как получился даже такой результат. У вас цикл $('.select__control option') внутри такого же цикла, хотя должен быть внутри цикла уменьшения размера строки. Я бы написал примерно так (за отсутствие ошибок не ручаюсь). Кстати, лучше использовать let вместо var, чтобы объявлять переменную только внутри области видимости, а не глобально.
$('#zip_code').on( "input", function() {
let zip = $(this).val().toUpperCase();
outer: while (zip.length > 2) { // outer - метка для прерывания. Если длина маленькая, цикл вообще не запустится.
$('.select__control option').each(function(){ // Тут - уже ваш цикл
let group = $(this).text();
if (group==zip) {
$(this).prop('selected', true).trigger('change');
break outer; // Если есть совпадение, цикл прерывается
}
});
zip = zip.substring(0, zip.length - i); // Уменьшаем на один символ длину строки поиска и запускаем цикл по новой
}
});