Yes, unreachable commits in Git are GC'd eventually, but you can disable it.
In Mercurial, hidden changesets are kept locally indefinitely, but they are not exchanged; only their obsolescence makers are. So you always know the meta-history of a changeset, but not necessarily their original content.
With Mercurial's evolve, the hidden commits are always there. When you push/clone, etc they get sent around.