даже если они уже установлены глобально
Ставить пакеты глобально не рекомендуется еще со времен node 0.6, ЕМНИП. Поэтому, даже если он глобально установлен, npm все равно поставит его локально.
включается в список зависимостей несколько раз
Все правильно, npm спасает вас от dependency hell'а. Сегодня has-ansi и strip-ansi требуют одну и ту же версию ansi-regex, а завтра has-ansi требует уже 3.x — это уже конфликт и придется переносить ansi-regex обратно внутрь. Аналогично с глобально установленными пакетами. А если речь о библиотеке, которую требуют десятки ваших зависимостей только первого уровня (например, underscore или lodash), и у всех разная версия?
В npm 3 обещают делать дерево зависимостей максимально плоским, возможно, там будет какая-то оптимизация на эту тему — попробуйте, бета уже есть.