Most of the methods you list there on Vec are for ergonomic reasons, to avoid having to write the .as_slice in some_vec.as_slice().foo() so much (by putting the common ones directly on Vec). With DST we can likely remove them and instead have a Deref<[T]> for Vec<T> implementation, which will allow the &[T] methods to be called automatically without being explicitly part of the Vec API (although you may not regard this as a good thing).
Returning a Vec from all those functions would be really really inefficient. Returning a slice is just returning a pointer into the memory owned by the Vec, but returning a Vec would require allocating new memory and cloning everything (or consuming the old Vec and shifting pointers/byte-copying data around, which is still inefficient, especially for tail). This slow behaviour copy-ful can be achieved with x.tail().to_vec() (etc.).
first is easily implemented as x[0] (well, really, if/when we move get to return an Option, x.get(0)); last is more complicated/annoying/easier to get wrong: x.get(x.len() - 1).
In what way are push and append unintuitive?
There’s .push_all_move which takes a Vec, both are somewhat useful, they can (and possibly should) be removed in favour of the more flexible .extend method:
v.extend(slice.iter().map(|x| x.clone()));
v.extend(vec.move_iter())
We would still need some form of mutable Vec. It’s a equivalent to C++'s std::vector (and can be more efficient due to Rust not having copy constructors!), with essentially the same functionality, as a (somewhat) general purpose sequence container that other structures can be built on (e.g. PriorityQueue and (previously) HashMap). An efficient immutable/persistent vector type is a different data structure, it is desirable but not a replacement for Vec.
I agree that the Vec API could use some adjustment/trimming (although I weakly recommend we wait until after DST before embarking in earnest), but having the ‘flavourful’ methods is nice, as you don’t have to write (and debug) them when you do need them. And if necessary, they can be optimised using unsafe code by the top Rust experts (with code-review by other top Rust experts); I think it’s a reasonable statement that unsafe code outside rust-lang/rust is less likely to be correct, on average.
(Another approach we could/should investigate is seeing if we can turn some of the Vec algorithms into more generic Iterator ones, similar to C++.)