The evaluation of new-if proceeds by evaluating the arguments, including the recursive call to sqrt-iter. Since this evaluation occurs even if good-enough? would return true, the evaluation will not terminate.