Потому, что в этой скобке хранится последнее найденное совпадение.
Грубо говоря - (\.\d)* находит - ".4", и добавляет его в скобку (\d+(\.\d)*), потом находит ".5" (так как установлено повторение именно скобки) и добавляет его снова во внешнюю скобку. Потом точно так же с ".1" и так как это последнее значение найденное этой скобкой оно и сохраняется. Сделайте так, и увидите разницу:
str = "For more information, see Chapter 3.4.5.1";
re = /chapter (\d+((\.\d)*))/i;
found = str.match(re);
alert(found);