The reason is simply this:
Recording a test is a good STARTING point. Once the test is recorded, there are at LEAST two things you need to do, and they are not necessarily simple.
1) Examine/evaluate what was mapped during the recording. Many times, objects have identifying properties that are dynamic and change from execution to execution and you will need to make modifications, updates, even completely remap objects and their hierarchy in order to more reliably identify the object.
2) Examine/evaluate the execution of the test case recorded with an eye towards timing issues. Many times TestComplete will attempt to move forward to the next step/line of code before the application is ready to be interacted against. Pages need to load, client-side components need to resolve/render, behind-the-scenes data needs to compile, etc. Liberal use of "wait" methods (do a search in the help for "waiting for objects") will help resolve this.
There may be more, but this is the starting point. Basically, record/playback for test automation in this day and age of complex applications is not a reliable means for creating a reusable and robust test scenarios, ESPECIALLY with regards to web applications.