UE4 wants the imported uassets to all live in the project structure, but the source data can live wherever.
I find that a best practice is to define a place where everybody checks out their project and work files, no exceptions.
That way, you can write scripts that know where to find things, and “last imported path” will point at the right location for re-import, etc.
Often, you’ll define some drive letter in Windows (“Q:” say) and use “subst” to make that point at the “real” location of the files.
The game would then go into “Q:/Checkout” and everyone will be good.
Separately, I keep my PSD, MAX, and similar files in a “ToImport” directory that’s inside the project directory, as a peer of “Content.” I then version control the entire project directory.
This works for smallish games, and should work for larger games if you use some source control that’s good for large binary files (like Perforce.)
If your programmers want to use Git, but your artists want Perforce, then you might want to have your “Checkout” directory contain “Project” as the UE project folder, checked out from Git, and “Art” as the source art folder, checked out from Perforce.
Finally, if you work on really, really, big projects with very long lifetimes (MMOs, integrated military simulations, etc) then the “everybody uses Q:\Checkout” rule breaks down, because you need to be able to build and run multiple versions in parallel, and re-subst-ing to point at different checkouts starts hurting your workflow.
For those situations, you need to write all scripts to know which project/version/directory they are run from, and do everything based on that directory, rather than a hard-coded path.
It’s still a good idea to have “Checkout” as the directory, with “Project” and “Art” as sub-directories in this case (and perhaps “Scripts” as a third checkout for all your custom scripts/tools.)
Hope this helps!