Arguably
http://chimera.labs.oreilly.com/books/1230000000929 by Simon Marlow is pretty authoritative on concurrency and parallelism in Haskell. As a nice bonus, it contains one of the best explanations of weak-head normal form and laziness in Haskell.
The exercises take you through inventing lenses from scratch.
Learning `lens` specifically entails learning contravariant, profunctors, choice, traversals, etc. It's not that bad understanding `lens` once you have a facility for algebras-as-typeclasses and have an idea of the end-goal by having played with and built lenses independently. To see some older forms of lenses, consider googling "semantic editor combinator". The nomenclature is suggestive.
Macros - basically anything about quasiquoting or TH. I point people in the same direction here as I do with Generics. Look at example applications and uses, then write your own. Being comfortable with folding/reducing ASTs will help a lot here. You could use Aeson's TH module as a place to start with this.
Continuation passing style - learning how "Cont" works is a good place to start with CPS in Haskell. It's intimidating but not particularly complicated…subtle in ways that can defeat learners.
I'm not much of an expert on Arrows. I feel people that have used them more (such as in arrowized FRP) might be more helpful here. I had use for `first` recently but I only used it because the Bifunctor wasn't available. I feel I might be stating something self-evident, but Arrows can be nice if you're kicking around a lot of stuff that's * -> * -> * and you want to address the types therein and not partially apply them out of scope from the interface. Example: Bifunctor is * -> * -> * whereas Functor is kind * -> *. This lets me choose to map over the "Left" or the "Right" constructors of an Either, rather than only mapping over the "Right" as in the case of the Functor.
Hope this helps.
--- Chris Allen