Se non erro, spero che piero.mac confermi la cosa funziona in questo modo:

c'è una durata della sessione (session.gc_maxlifetime)
c'è una durata del cookie di sessione (session.cookie_lifetime)

In pratica c'è un meccanismo, che dopo la scadenza della sessione fa scaturire il garbage collector e rimuove i file di sessione sul server.

Ad ogni richiesta sul server, c'è una probabilità pari a session.gc_probability/session.gc_divisor che venga lanciato il garbage collector.
Supponiamo 1 probabilità su 100, quindi

session.gc_probability = 1
session.gc_divisor = 100

Quando viene lanciato il garbage collector, tutti i file di sessione creati nella data corrente meno session.gc_maxlifetime secondi vengono cancellati.

Il punto quindi è questo:

Se hai la durata di sessione di 10 minuti, mentre la durata del cookie a 20, non è detto che entro i 20 minuti la sessione sia stata effettivamente cancellata, perchè non è stato fatto scaturire il garbage collector, quindi avendo ancora l'id di sessione e essendo ancora presente il file riuscirai a vedere i dati anche se il tempo da te stabilito per il server è ampiamente scaduto.
Questa è una cosa che è molto probabile capiti in locale, dove le richieste al server sono di numero ridotto.

Spero di averci azzeccato :P