Most browsers these days support the history API. The history API is a "HTML5" feature that makes it possible to change the URL and maintain history not to mention manipulate the back button. There is also a wrapper for it out there that provides back-ward capability with #! technique you described.
The whole URL manipulation thing is really just a decorative touch. It by itself does not make for physically pages that can be crawled. It needs to be combined with what I mentioned above. In that you build a site that works properly with refreshes. Than add the AJAX layer on top and manipulation for the URL.
edit: Decorative isn't the right word to use considering it does make the state of the application restoreable in terms of book marking and navigating to the URL… when done right.