Why do games install existing components each time I install a game?

This can be for a number of reasons, all depending on the game in question...


Version Differences

You may have insert any component installed, but the game's installer includes a different version. This is the most likely reason. For example, according to Steam there are over 40 version of DirectX 9, and many more for later versions of DirectX. See this answer which specifically addresses the reason why there are so many C++ redistributables. The version differences for such components tend to be minor patches, such as bug fixes. Also, each minor patch/version needs to be a separate installation to avoid problems such as DLL Hell.


Installer Configuration

The installer is configured to just reinstall all components each time (this ensures that the game has the correct installation). This avoids checking for existing files (quicker, less issues with false positives) and/or asking the user a bunch of setup questions (i.e. a streamlined installer UI). From my experience, Steam does this. The explanation could be to ensure that you have the correct 1 of 40 or so possible versions of the component. You are not alone if this is what you are experiencing, other people have noticed the problem too.

Additionally, from the Steam article linked above, this snippet of info may explain some scenarios:

Games which don't use the D3DX helpers (such as Source engine games) don't require running the installer on first launch as they only depend on major d3d9/10/11 versions being installed. However, games that do use D3DX must run it as it's the only way Microsoft has allowed for distributing and checking the version info on the files.


Locally Shared Libraries vs. System Libraries

The game installs the components to a different location than the usual location of system components. For example, a subdirectory for the game's installation folder. This is known as "using a shared DLL" when compiling a program for Windows (Visual C++). The game may lose out on officially patched runtimes that are installed into the standard system directories, but this approach allows a developer to have more control over the distribution of third party components. This approach also allows a developer to use a special build of a specific library. Note that for some third party components there are no "official" builds (i.e. the developer must use the source code to generate their own build via their chosen compiler).

I would say this is the most unlikely reason. If the DLLs are installed locally then it would probably be done as part of the main installation. However, I have seen this with software other than games. I'm not sure if this is still the case but some QT-based applications I have used in the past have used locally copied QT DLLs.


Installation Script Bugs

Minor installation script issues or bugs, such as the installer not having the access rights to read specific folders/registry keys. Let's not rule out actual problems in the installation script, which are subject to all kinds of operating system / access rights issues.