The reason is for project maintenance and consistent (and simple) usage. Now each package is perfectly independent of the others, and each package adheres to its own package.json
file.
If one package updates its dependencies, NPM simply has to check that package. If it were sharing a reference, it would not only need to update the new version for the one that changed, but also switch and re-reference the old version for the other package. Or if a package was deleted that shared a reference, NPM would need to re-check all other packages to see if another was still using it. And other odd use cases when sharing.
Storage is cheap these days and most NPM modules are small in (file) size. Ease of maintenance and consistent updating is worth more than saving a few MBs of files.