Instead of overriding, you can use the default gmod PlayerSetModel hook. TTT calls it just like gmod calls it. TTT's GM:PlayerSetModel function only runs if there is no hook that returns true for that player.
local function DetectiveModel(ply)
if IsValid(ply) and ply:IsActiveDetective() then
ply:SetModel ( "models/player/gman_high.mdl" )
-- Important: if you do not return true, TTT will set a model for the player, overriding yours
return true
end
end
hook.Add( "PlayerSetModel", "Detectivemodel", DetectiveModel )
This won't work in this case, however: PlayerSetModel is called when players spawn. At that point, traitors and detectives have not been selected yet. You have to hook TTTBeginRound and loop over all players, check if they're detective, and change their model.