From what I remember reading is that guard clauses are meant to be exactly that - a piece of code that determines whether or not this function is the right one to be envoked based on the given params.
It's not meant to a place to run blocks of code that are computationally heavy, but rather a lightweight check which can resolve a true or false answer relatively quickly.
For example, with the code you gave, what happens if your list is 10 Billion elements long? The compiler would have to check every single element in the list before it even executed the code in method. Now imagine if you had a another one that was
when Enum.all?(a, &(&1 * 2 > 3))
.
The compiler would then have to run both guard clauses and check every element of the list for both (if the first one failed), which basically is going to take a long time.