A possible solution:
> import Data.Monoid
> import Debug.SimpleReflect -- not really needed, just for showing the result
> (appEndo . mconcat . replicate 5 . Endo $ f) a
f (f (f (f (f a))))
Another (already mentioned):
> iterate f a !! 5
f (f (f (f (f a))))
(add lambdas if you want to turn it into a function)
However, don't forget that Haskell is lazy: the above methods will first build a thunk by applying f many times and only then start evaluating. Sometimes f could be iterated in constant space, e.g. when f :: Int -> Int (and f itself works in constant space), but the above approaches only work in linear space.
I would define by own strict iteration combinator, e.g.:
iter :: Int -> (a -> a) -> a -> a
iter 0 _ x = x
iter n f x = iter (pred n) f $! f x
or even,
iter n f x = foldl' (flip $ const f) x [1..n]
which is more of less the Haskell translation of what was already posted in the question.
Alternatively, we can can define a strict version of iterate (which IMHO should already exist...)
iterate' :: (a -> a) -> a -> [a]
iterate' f x = x : (iterate' f $! f x)