Hmmm, OK. I tried this:
CREATE LOGIN JoeDBA with password = 'xxx'
GRANT ALTER ANY DATABASE TO JoeDBA
I then opened a new window, logging in as JoeDBA and ran:
EXEC sys.sp_detach_db @dbname = 'Bob'
Msg 916, Level 14, State 1, Line 1
The server principal "JoeDBA" is not able to access the database "Bob" under the current security context.
Then tried this in my sysadmin connection:
CREATE USER JoeDBA FOR LOGIN JoeDBA
ALTER ROLE db_owner ADD MEMBER JoeDBA
Returned to my JoeDBA connection and was able to detach the database.
ALTER ANY DATABASE is not sufficient, but db_owner for a db is. This means you'd need to ensure each login had that permission in each database to detach.
I also tried dbcreator and serveradmin (separately) for the login. neither allows me to detach a database. I suspect sysadmin OR db_owner in a specific database allow detaching. Of course, if you add the user to model and include db_owner, that would solve that permission set.