Событие выполняется дважды: первый раз при клике, далее хеш меняется и срабатывает событие hashchange.
Так как код при клике аналогичен тому, что происходит при смене хеша, нет смысла его дублировать: можно полагаться только на событие и удалить в обработчике клика всё, что происходит после:
window.location.href = '#' + hash.substr(0, hash.length - 1);
Впрочем, простой клик по ссылке с якорем, который вы пытаетесь отловить, должен точно так же генерировать это событие, поэтому я вообще не вижу смысла в первом обработчике.