We were able reproduce this behavior in the following scenario: If a subroutine step was the initial step that failed, and the failure steps also call a subroutine, the child project returns success rather than failure upon completing the failure steps. We have a test build available at
http://www.kinook.com/Download/VisBuildProTest.exe that you can try to see if it resolves the problem in your case.