La cosa è facilmente comprensibile guardando il codice del "core" (
... ho messo insieme alcune parti per semplificare la lettura) ...
// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))
// the whole number of milliseconds per timer0 overflow
#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)
// the fractional number of milliseconds per timer0 overflow. we shift right
// by three to fit these numbers into a byte. (for the clock speeds we care
// about - 8 and 16 MHz - this doesn't lose precision.)
#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)
#define FRACT_MAX (1000 >> 3)
#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() )
unsigned long micros() {
unsigned long m;
uint8_t oldSREG = SREG, t;
cli();
m = timer0_overflow_count;
#if defined(TCNT0)
t = TCNT0;
#elif defined(TCNT0L)
t = TCNT0L;
#else
#error TIMER 0 not defined
#endif
#ifdef TIFR0
if ((TIFR0 & _BV(TOV0)) && (t < 255))
m++;
#else
if ((TIFR & _BV(TOV0)) && (t < 255))
m++;
#endif
SREG = oldSREG;
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
}
... ora, se si esamina l'ultima riga:
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
... è evidente che, indipendentemente dal valore ( ( m << 8 ) + t ) il tutto viene moltiplicato per (64 / clockCyclesPerMicrosecond()), ovvero ... 64 / ( F_CPU / 1000000L ), ovvero 64 / 16,
ovvero 4 
Da notare che, al calare della F_CPU, la risoluzione
peggiora in proporzione ... con il ATmega328P a 8MHz quel rapporto da 64 / 8,
ovvero 8 e con il ATmega328P a 1MHz addirittura
diventa 64 ...

Guglielmo