Here's why you're getting the longer repetition first:
buildLenList "bang"
= buildLenList (_:"ang")
= [1 + length "ang"] ++ buildLenList "ang"
= [4] ++ buildLenList "ang"
(...) = [4, 3, 2, 1]
And the reason calling myReverse on that doesn't give you [1, 2, 3, 4] is that you're reversing a different list every time:
blowup "bang"
= blowup ('b':"ang")
= myRepeat 'b' (head (myReverse (buildLenList ('b':"ang"))) ++ blowup "ang"
= myRepeat 'b' (head (myReverse [4, 3, 2, 1]) ++ blowup "ang"
= myRepeat 'b' (head [1, 2, 3, 4] ++ blowup "ang"
= myRepeat 'b' 1 ++ blowup "ang"
= "b" ++ blowup "ang"
= "b" ++ blowup ('a':"ng")
= "b" ++ myRepeat 'a' (head (myReverse (buildLenList ('a':"ng"))) ++ blowup "ng"
= "b" ++ myRepeat 'a' (head (myReverse [3, 2, 1]) ++ blowup "ng"
= "b" ++ myRepeat 'a' (head [1, 2, 3] ++ blowup "ng"
(...)
Since you only asked for help with how it evaluates, I'll withhold further spoilers. :) However, I strongly recommend getting more comfortable using the (:) operator for construction instead of just pattern matching; in a couple of your functions it would be a better tool than (++). Also, "at-patterns" are great:
blowup l@(x:xs) = myRepeat x (head (buildLenList l)) ++ blowup xs