Pass a value from a block preprocess hook to a twig template that inserts that block
After a lot more digging and trying things without success, I ended up solving the problem of passing a value from a block's preprocess hook to a twig template where the block is inserted as per my third option above. Here's what I did:


Follow the instructions at http://www.tothenew.com/blog/overview-of-twig-extentions-in-drupal-8 to create a twig extension. This wasn't very difficult, especially since I had already created a custom module. I just had to create a MYMODULE.services.yml file and a TwigExtension.php file as instructed.
In the twig extension file, create functions setTwigValue($name, $value) and getTwigValue($name) using the php $GLOBALS array for storage. Again, the above-mentioned instructions made this pretty easy.
In the preprocess_book_tree hook, count the number of feature articles and then save the count by calling

Drupal\MYMODULE\TwigExtension::setTwigValue('feature_count', $feature_count);
In the node--magazine.html.twig template, get the saved value using

{% set feature_count = getTwigValue('feature_count') %}


I'm happy to learn of better/safer ways to accomplish what I've done. But at least it works and it's pretty clean.