First, thanks @electrik and @hard-shovel for your input.
Indeed, using the const int to hold the BAT_RPT_INTERVAL in seconds was wrong - good find @electrik.
I fixed (changed all intervals to minutes) and the sketch continued to behave as before.
I then changed the intervals:
const int SLEEP_INTERVAL_MIN = 1;
const int BME280_RPT_INTERVAL = 2 * SLEEP_INTERVAL_MIN;
const int BAT_RPT_INTERVAL = 3 * SLEEP_INTERVAL_MIN;
This apparently fixed the battery reporting, but I was still getting the BME280 sensor readings with each sleep cycle.
I then decided to comment out bme280.setReportIntervalMinutes(2 * SLEEP_INTERVAL_MIN) and added node.setReportIntervalMinutes(2 * SLEEP_INTERVAL_MIN) .
After this, it appeared to be operating as expected (at least as far as synchronous timed reporting).
This led me to think that perhaps the default for node.setReportIntervalMinutes() was the same as the sleep interval.
I then tried setting bme280.setReportIntervalMinutes(2 * SLEEP_INTERVAL_MIN) and added node.setReportIntervalMinutes(0) . My thought was that this might effectively disable node wide child sensor reporting. Indeed, it looks like that is what it did.
So far so good.
I then went to look at the asynchronous reporting when an external interrupt gets generated. Sometimes it would only send the change event and other times it would also send the BME280 sensor values. I noticed a pattern and believe that interrupts are being treated like sleep intervals so that 2 interrupts (e.g. in quick succession) would result in the BME280 sensor values getting sent.
I guess I better study the code.