The $mCategoryViewerClass variable defined in CategoryPage is protected, and therefore that prevent the hook CategoryPageView to override the viewer class without extending CategoryPage and rewrite the function CategoryPage::view() where this hook is raised.
An example of current implementation is this extension :
https://phabricator.wikimedia.org/diffusion/SVN/browse/trunk/extensions/PeopleCategories/PeopleCategories.php
https://phabricator.wikimedia.org/diffusion/SVN/browse/trunk/extensions/PeopleCategories/PeopleCategories.body.php
We can see that the MediaWiki source code evolved since this extension has been written. But we force the author of the extension to duplicate the code while implementing PeopleCategoriesPage. If $mCategoryViewerClass was public, he could do this:
$wgHooks['CategoryPageView'][] = 'efPeopleCategories'; function efPeopleCategories( &$categoryArticle ) { $categoryArticle->mCategoryViewerClass = 'PeopleCategoriesViewer'; }
... and implement only PeopleCategoriesViewer.