My vote here is “nuke as much special uncategorized code as possible”. The more we have the more confusing stuff gets.
So I would vote for:
show uncategorized if there is at least a topic, no matter the value of ‘allow uncategorized topics’ setting
Provided the implementation deletes special magic code from Discourse and we carry less edge cases around.
Basically pick the solution that deletes more code from Discourse.