One of the most important lessons in development is knowing when its time to stop.
What typically happens is a developer adds a features. That in turn inspires more ideas. So more features get added. That is, as you said, one of the ways a project becomes vaporware. The developer never sees the project as 'finished', so it never gets released.
The habit you want to get into is to stop thinking in terms of a release/version as a 'finished' project. Rather, look at development as a long-term process. Think of releases as milestones along the path to what you one day hope the program will be. Thus, a release/version is just a snapshot of where you are in the longer term process... a snapshot thats been well rounded out and tested.
What you can do, on the practical side, is sit down and spec out your next release. It doesn't have to be terribly thorough. Write down the 3-5 new major pieces of functionality you believe are essential for the next release. (actual number of features may vary depending on the type of app, not counting bug fixes or minor gui changes) Work on those. If you come up with other ideas, thats fine... just make notes and implement them in the following release. When you get those 3-5 items done, your release is ready for beta.
When I start a new application, I typically think about the final 'vision' for the app. That, to me, is what I want in version 3 of the app. With that benchmark, I have an idea of what will make solid version 1 - just the basics.
Summary:
Each release does not have to be the finished 'vision' of the project. Just a milestone towards that vision.