mira el problema que tu presentas es de tipo por que siempre le envias al procedimiento el padre del componente actual, lo que deberias es comprobar si el componente que te esta llegando es un TMenuItem que es el parametro que espera, la forma de asegurarnos de esto es hacer esta pequeña modificacion al codigo
Código:
procedure Tprincipal.habilitarItems (item: TMenuItem);
begin
//LINEA PROPUESTA
if not(item is TMenuItem) then Exit;
//asi te aseguras de que estas trabajando con tmenusitem y no con otro componente que sea padre del menu
if (item.HasParent ) then
habilitarItems (item.Parent);
item.Visible:=true;
end;
si el problema es que el componente no se ha creado entonces el error esta en la primera llamada del procedimiento porq luego el ciclo trabaja solo con los padres que son componentes ya creados
suerte