You can use array[0..4].try_into().unwrap() since there is an impl<'a, T, const N: usize> TryFrom<&'a [T]> for &'a [T; N] in the standard library.
It's because the indexing operation has the signature (&[T; N], Range) -> &[T], and nothing in the return type says that the length will be exactly 4. Of course in this case you're indexing with a literal, so if the operation doesn't panic then the returned slice is guaranteed to have length 4, a compile-time constant, but the compiler doesn't have the machinery to reason that way presently; it would require a new trait beyond std::ops::Index with a &[T; M] return type, and a desugaring for the array[0..4] syntax that invokes the new trait.
Edit: transmute here would be unsound since &[T] and &[T; 4] do not have the same layout! (Fat pointer vs. thin pointer.) In fact, transmute will just panic when you ask it to do this.