E' sbagliato l'approccio: non devi usare l'attributo "data-max" per gestire quel dato.
In realtà il valore di data-max viene impostato correttamente ogni volta (lo puoi verificare dalla console del browser). Il problema è che tu, per gestire i limiti, utilizzi il data storage di jQuery attraverso la chiamata a data('max'). Questa chiamata legge il valore dell'attributo solo la prima volta, dopodiché se lo salva in memoria e le volte successive lo va a cercare direttamente lì. Per questo ti rimane sempre il primo valore.
In sostanza, devi cambiare il modo in cui memorizzi i dati, lavorando direttamente sul data storage
codice:
$('.item_size').change(function(){
var dataMax = $(this).find(":selected").data("qty");
$(".item_quantity").text('1');
$(".increment_qty").data("max", dataMax);
$(".decrement_qty").data("min",'1');
});
Ne consegue che data-min e data-max sono superflui