I love one-liners as much as anyone else, but they come with a cost - namely they're harder to read than being explicit. So lets start with the "normal" way to do what you're describing:
ArrayList<E> copy = new ArrayList<>(list);
copy.add(value);
return copy;
It's a few lines, but it's efficient, straight-forward, and easy to read. We want any alternative to be an improvement on this syntax, not simply replacing readability for conciseness. If you're trying to decide between the implementation you've posted and the "normal" version, the "normal" version should win hands down.
We can try to improve on your solution with Stream.concat() and Stream.of().
return Stream.concat(list.stream(), Stream.of(value))
.collect(Collectors.toList());
It's technically all one statement now, but we still need to split it over multiple lines to make it readable. It's also a lot more boilerplate than the standard implementation.
Instead we can use the builder pattern Guava provides for its Immutable collections:
return new ImmutableList.Builder<E>().addAll(list).add(value).build();
This is more concise, and conveys our intent nicely. This is how I would recommend implementing the behavior you describe (using Guava or by defining your own builder pattern). Not only does it work for this specific use case, but it scales to any arbitrary combination of values and collections.
I think (it's hard to read :) ) your example actually replaces the last value of the list with your new value, rather than adding it to the end. If that's what you want, just use List.sublist() to truncate the last element from the list, e.g.:
list.sublist(0, list.size() - 1)
Use that anywhere I have list above to exclude the last value.