So I went back and tried to find the smallest piece of code that would cause the problem. It took a while but I figured it out and it's attached at the end of this message.
I eventually figured out that the center PWM has some limits with very slow PWM speed. Under something near 370 hz, the Timer1 PWM can no longer reach 100%. Changing the Timer1.h code as I showed above allows the PWM to work correctly below that frequency but also causes the actual frequency to double. I've tested the PWM down to 8hz with that change and it seems to work perfectly.
#include <TimerOne.h>
const int fanPin = 4;
void setup(void)
{
Timer1.initialize(1000000/10); // 40 us = 25 kHz
Serial.begin(9600);
}
void loop(void)
{
// slowly increase the PWM fan speed
//
for (float dutyCycle = 30.0; dutyCycle < 100.0; dutyCycle++) {
Serial.print("PWM Fan, Duty Cycle = ");
Serial.println(dutyCycle);
Timer1.pwm(fanPin, (dutyCycle / 100) * 1023);
delay(500);
}
}