Print numbers in a spiral from the center
Not too advanced myself - so take with a grain of salt.

Foremost I would separate the logic for constructing the grid and printing. Especially extract the function to construct the grid.  Currently its wrapped in printClockwise  IMHO it should be prominently its own function.
There are a few definitions in printClockwise  (emptyGrid, directionOrder and the printing) that I would consider reusable and would make them top level.
You only use lens in one place. lens is quite an expensive import - there just was an interesting post.  I suppose your intend was to learn lens and therefore it's used - but just for the code I would consider removing the dependency.
the fixed &quot;%4s&quot; in printing - it's easy to estimate the required width for larger numbers. Or just make it that max n is 999.

Some stuff to consider that is really personal choice - no need to follow if you disagree:

changing the data type to strict mutable array or similar.
adding a walk that takes larger strides.
split the walk function into one stream of positions in the spiral, and separately setting the values in a second step.  This could solve the issue that the input needs to be a perfect square - just take the first n positions.

As last remarks:

whenever I see such a spiral I think Ulam spiral. If you want to expand I would consider adding functionality to the printing to allow highlight - in this case for primes.
I also checked whether the coordinates are on OEIS - they are A174344. And your algorithm agrees with the algorithm they post along side (the Julia implementation is almost the same, the other use some shenanigans with sin and cosine).