I have found this surprising hard to explain, so I will start with an illustration of a hypothetical category list (with post counts).
So there are 2 posts, 1 in Cat1 and 1b, the other in Cat2b.
Naturally I want to hide Cat3 as it has no posts.
Unfortunately, using hide_empty=1 also hides Cat2, even though its sub-cat isn't empty.
I could of course add the second post to the top-level cat (Cat2), but this is rather laborious, and may not be up to me anyway.
I could also use the exclude, but again that may be quite laborious and out of my control.
Can I recommend that list_cats be changed to check the sub-categories.