Hi Dan,
In most cases, the issues you face can be caused by the modifications in your application. Sometimes, you can avoid this problems beforehand, by creating stable and strong mapping criteria.
However, a way to work around this kind of problems depends on the way your application changes from one build to another. If the changes in your application are associated with changes of objects' names, you can use the Name Mapping feature to give special mapped names to objects. However, when Name Mapping is used, you need to map not only the needed object, but also all of its parent objects. So, if there are some changes in the object hierarchy, Name Mapping cannot avoid the objects availability problem.
In this case, you can use another feature - Aliases. Objects mapped with the Aliases feature are available by their independent mapped names. Please see the Name Mapping - Overview article for more information.
Also, in TestComplete 8, there are several improvements in Name Mapping mechanisms. For example, using conditional mapping criteria allows you to create much more flexible Name Mapping schemes. See the Using Conditional Mapping Criteria article for details.
BTW, this screencast can be very helpful in learning the ways to create reliable mappings.
Unfortunately, if the tested application's behavior changes, you will have to rewrite your tests.