One thing you can do is make the addon path user-configurable. Besides allowing you to configure this differently on the server and the client, your end users may also find this feature useful, especially if they have multiple storage drives on their computer.
However, at least under Linux, it is possible to have a directory show up as having different contents for two different processes, by using what’s called a mount namespace. By placing a process in a new mount namespace, it is possible to mount volumes which will only exist for that process and its subprocesses. If you create a new mount namespace, and mount a temporary file system on top of the addon content directory, you can then start the client in the new namespace and the server outside of it, and the client and server will see entirely different contents in that directory.
For the following instructions, replace
$ADDON_DIR with the path to the addon content directory, and
$USER with your local username:
Start the server normally, and tell it to use an addon you have installed.
sudo unshare -min a terminal, and enter your password. This will bring you to a root shell in a new mount namespace.
At the root prompt, run
mount -t tmpfs tmpfs $ADDON_DIR. This will mount a temporary, empty filesystem over the addon content directory, but will only take effect within the new mount namespace.
At the same prompt, type
runuser $USER. This will switch back to your regular user in a subshell, which is still inside the new namespace.
From that subshell, launch the game client and connect to the local server. Since the client is running in the new mount namespace, it will see an empty addon content directory, and proceed to download the content.