As already mentioned in the comment: FullForm is a function that evaluates in the standard way because it has no attribute saying otherwise. One consequence is that before FullForm acts on your input, it evaluates it, which leave only the result of cases.
None of this helps you to get your answer anyway. One easy way is to use Unevaluated on arguments to get what you like
FullForm[Unevaluated[Cases[{a^2,a^3},a_^1]]]
(* Unevaluated[Cases[List[Power[a,2],Power[a,3]],Power[Pattern[a,Blank[]],1]]] *)
This works, but you will have the Unevaluated in your output. Another way is to temporarily give FullForm an attribute to hold its argument. This can be achieved with Internal`InheritedBlock.
Internal`InheritedBlock[{FullForm},
SetAttributes[FullForm,{HoldFirst}];
Print[FullForm[Cases[{a^2,a^3},a_^1]]]
]
(* Cases[List[Power[a,2],Power[a,3]],Power[Pattern[a,Blank[]],1]] *)
You may ask why I print the output. The problem is that as soon as we leave the block, Mathematica restores the normal behavior of FullForm which leads to an evaluation like you have seen it. Another way of getting the ouput that looks like it doesn't evaluate anymore is to replace the last line in the block with
HoldForm[#] &[FullForm[Cases[{a^2, a^3}, a_^1]]]
This should give you a start how to handle those cases in future. I strongly recommend that you read the Tutorial on Non-Standard Evaluation and the references therein.
FullFormshows the result of the calculation. It's notHoldAll. – Michael E2 Jan 02 '15 at 23:30FullForm(that I can see) is a method given to show the unevaluated verbose form of an expression. I therefore contend that it is not "easily found in the documentation." – Mr.Wizard Jan 03 '15 at 06:31