You've simply asked for every number less than 1000 in a list. You know that the list is sorted, but your algorithm doesn't take advantage of this. The compiler does not automatically realize you're working with sorted data, and cannot infer that once you've seen a number that is at least 1000, you can never again see one that is less than that.
As others have pointed out, takeWhile (< 1000) [1..] leverages your knowledge of how special your list is by specifially stopping its examination of the list once the predicate has failed for an element (in this case, once a number that is at least 1000 has been encountered). Notice how this is an optimization available because [1..] isn't "just a list"; it's a list with special properties (in particular, it's sorted).