It generally has to do with CPU architecture issues.
For example, many (many!) years ago, I was working for a man whose franchise business relied on software provided to his firm by the parent company. He was upset that I couldn't run an accounts payable program on his business computer when the parent company said that he could.
When I hacked the program to look at the code - no great feat since it was written in BASIC - I found ASSEMBLER subroutines in the code. These subroutines essentially do direct addressing of CPU and memory architecture which can be very efficient in some ways, but not in others. Put simply, the program was written to be run on an IBM PC-XT while the business had a PC-AT; 2 different CPU classes. If the program ha been written entirely in BASIC, it would have worked, but not as provided.
The problem isn't with ARM, it's with the code and what CPU's it's been designed for.