эммм
так и должно.
с(?=a{3,4}) заканчивает свою работу когда находит 'сaaa', что дальше ей все равно и {3,4} в этой конструкции не имеет смысла достаточно {3}, т.к. я уже написал выше "находит 'сaaa', что дальше ей все равно"
То, что ты хочешь.
var re = /c(?=a{3})(?!a{5})/;
var str = 'caaandy';
alert(str.match(re));
var str = 'caaaandy';
alert(str.match(re));
var str = 'caaaaandy';
alert(str.match(re));