Well, inevitably, despite looking for a solution to this for days, I figured it out a few minutes after posting the question.
- In Xcode go to File|Workspace Settings...
- Change the Derived Data Location to Workspace-relative
- In each project that references a workspace library, remove and re-add the library
That's it. The derived data will now be in a simply and consistently named subdirectory of the directory the xcworkspace file is located in.
Make sure you've added this directory to your source control system ignore list (e.g. .gitignore, ~/.gitignore_global)!
You might be tempted to use a custom directory. Be aware that if you do the absolute path will be saved in the xcworkspace settings. If the path doesn't exist on another machine the build will fail - this happened to me because I have my user directory on a different drive on my desktop machine, so that path was invalid on my single drive laptop.