I will give you two main reasons why MPI and OpenMP dominate.
The first one is that they are standards. There are several available implementations, and you can be sure to find them available on every possible supercomputer machine. This is strictly related to the concept of portability: you write your parallel code and, if you do not use anything else related to a particular machine, you can run the same code on all of the parallel machines you have available.
The second reason is the programmer's resistance. With MPI and OpenMP covering both message-passing and shared-memory parallel programming (and you can even use them simultaneously if useful and/or required) why a programmer, especially a beginner in the field, should spend his/her time learning new parallel programming languages that are not granted to become standards? Sure, as you pointed out, other languages provide some benefits but the question is, would you invest your time betting on something that may even totally disappear in the future ? Standards are here to stay. Anyway, regarding this specific point, my humble opinion is that, if possible, one should instead spend some time on different languages (not just those one for parallel programming) because this is a useful discipline and learning different paradigms is always beneficial. However, when reading your curriculum vitae for possible hiring, the people that can hire you for a position will be in general mostly interested to your knowledge of the standards, not to your knowledge of niche languages (in general, even though there could be exceptions of course).