No, Rust also has plain old, ungrowable arrays. Which you have to use in const evaluation, because as you deduced correctly, you can't do heap allocations in constant contexts, as constant evaluation happens during compile time and not during runtime. The heap only exist during runtime. There are efforts to bring heap allocations to const eval, but I don't think you'll be able to do that any time soon.
As for your VOWELS, you can either declare it as an array or a slice:
Hmm, I'd say arrays are stronger typed here, because they have the associated constant size. Its also easy to create a slice from an array, but it is hard to create an array from a slice, so arrays are more versatile. On the other hand they are more verbose, because you need to deal with the constant size. In your case adding the correct size is easy, because you know the length of the array. But if you were to generate the array differently, you'd have to get the right size somehow.
No. You can store a vector itself on the stack. It's just that it always heap-allocates the internal buffer it manages, but you still can put the vec itself (ie, the pointer-length-capacity triple) on the stack.
The reason is exactly what the compiler pointed out. Const expressions are evaluated at compile time, and currently, the const evaluator doesn't support allocating memory.