Wop!
De la primera, Delphi va a la dirección de memoria de la referencia, da por supuesto que es de la clase que le indicas e intenta acceder a la dirección del método o la propiedad en cuestión. Si la referencia no es de ese tipo, saltará un Access Violation.
De la segunda manera, Delphi comprueba (en ejecución, claro) que la referencia sea de la clase "prometida" o de un descendiente. Si no lo es la excepción es un poco más elegante: te dirá que no puede hacer el cast.
El primer sistema es más más rápido, así que, como normalmente no querrás que salga ninguna excepción, lo típico es el siguiete patrón:
Código Delphi
[-]
if Refencia is Clase then
Clase(Referencia).LoQueSea
else
LoQueTeParezca;
No obstante, existen algunas circunstancias en las que no podrás hacer el cast directo (sin el "as"), por ejemplo si trabajas con variables de clase.