The recursion in the first code takes place in the pattern, with the code fu[w] in FreeQ[c, fu] fu[w]. In evaluating FreeQ[c, fu] fu[w] to test the pattern, the fu[w] will be evaluated, which will cause another pattern-matching test, which leads to another evaluation of fu[w], and so on.
You didn’t ask for workaround, but if it’s any help, you can prevent fu[w] from evaluating with
It won’t explain everything by itself, but you can study it to reconcile it with your understanding of the evaluation process. Setting $RecursionLimit to its minimum yields a readable amount of output.