I would say firstly that you're going to get a variety of opinions on this subject.
In the example you linked to, I'd say a visual tree walker in that case was the wrong solution - WPF is usually best used with some sort of MVVM or MVP-like pattern, and that means data binding, and if you bind to appropriate structures you can eliminate a lot of what you might have done with visual tree walking.
I only tend to use it for 'special effects', as it were. The big internal WPF app I work on has some visual tree walking code which adds some convenient behaviour to a few ItemControl
s in a reusable manner (lots of fun with type parameters to make that one work).
We also walk the visual tree in the implementation of some attached properties which are part of the system that controls whether a particular user is allowed to manipulate certain parts of the UI. This is because this system has to transform the visual tree regardless of what the underlying data says - user permissions are a cross-cutting concern which the underlying data shouldn't have to worry about at every single step.
Basically we only do it to do things to the UI itself - UI behaviour that can't be done in a more convenient way (and let's be honest, most other ways are more convenient in most cases), or actually adjusting the visual tree based on some factor which isn't conveniently expressible in the data the UI's bound to. If it's about manipulating data, we always do it in the backend data structures or ViewModels.