The command_alter hook is not super friendly / obvious when it comes to complete command replacement, as this hook was only designed to make minor alterations to the command. It is all the same possible to replace one command with another, but the process is a bit obtuse, as you need to reset some variables that Drush has already initialized.
This should do the trick:
/**
* Implements hook_drush_command_alter
*/
function policy_drush_command_alter(&$command) {
if (($command['command'] == 'features-revert-all') && (drush_drupal_major_version() >= 8)) {
$command['command'] = 'custom-features-revert-all';
$command['command-hook'] = 'custom-features-revert-all';
$command['primary function'] = FALSE;
$command['arguments'] = array(); // Adjust this only as needed
drush_set_command($command);
}
}
Note that this example removes any arguments the user may have passed to the command; I included this just to demonstrate how to alter the arguments, in case this is needed. Remove the assignment to $command['arguments']
if you'd like the original args passed through.