There's nothing wrong with your code. However, some people like to follow the style of defining little functions, which among other benefits, can make the code more readable by introducing better names.
const pushVideos = videos => videos.forEach(pushVideo);
const pushVideo = video => allVideoIdsInMovieLists.push(video.id);
const pushMovie = movie => pushVideos(movie.videos);
movieLists.forEach(pushMovie);
However, you have a couple alternatives for structuring this code. First would be one big concat:
allVideosInMovieLists = [].concat(...movieLists.map(movie => movie.videos.map(video => video.id)));
It would also be reasonable to write a good-old for loop:
for (movie of movieLists)
for (video of movie.videos)
allVideoIdsInMovieList.push(video.id);
There are those who would say this is more readable.
Going back to your original code, deconstructing the arguments lists might make it a bit more readable:
movieLists.forEach(({videos}) =>
videos.forEach(({id}) =>
allVideoIdsInMovieLists.push(id)));
.map()and.concat()let allVideoIdsInMovieLists = [].concat(...movieLists.map(({videos}) => videos.map(({id}) => id)))or.map()and.pop()let allVideoIdsInMovieLists = movieLists.map(({videos}) => videos.map(({id}) => id)).pop()