With regards to your solution, yes, you could argue that it is more readable - and that is not without merit. I think the counter argument would be that the other solutions are also readable, once you are more familiar with those patterns.
If I were to critique your solution, once thing I would say is that the last else if can just be and else - there are no conditions under which that last if condition will be false. But that’s a trivial thing.
Also, do you need to split the alphabetArray? Those methods work on strings, too.
From an efficiency standpoint, I would be worried about how you’re progressively concatenating the string. For each iteration, you are creating a whole new string and garbage collecting the old string. It’s not like with a number where you’re just adding a number but it’s still in the same memory location. This is a minor thing if the coded message is small, but it is something about which to think. This wouldn’t be an issue in some languages where a string is an array of characters, but JS doesn’t think that way.
If you want to use map or forEach, you would have to convert it to an array first - those work on arrays. But that is a good solution. If you want to try that, I think that would be worthwhile. I think map is a better solution. forEach could work but I think would be a little less elegant. So, you would need to separate the string into an array, map it to change the values, then convert the array back to a string.