¡Ah! Entonces SÍ ejecuta la sección de finalización, sólo que no entra al If que mencionas.
Lo primero que salta a la vista es que si usas FreeAndNil no necesitas comprobar que la variable sea diferente de Nil. Es decir, si dentro de ese If solamente tienes la llamada a FreeAndNil, el If sobra (FreeAndNil admite punteros con valor de Nil, no haciendo nada si fuese el caso).
¿Sería mucho problema poner el código real completo de las secciones Initialization y Finalization de esa unidad?
¿Cómo compruebas el valor de la variable objeto? Detenido el programa en el punto de ruptura del If (o del FreeAndNil en caso de que quites el If), si agregas una entrada a la lista
Watches "Variable = Nil", ¿qué valor se muestra ahí?