If you don't return $self, you're taking the decision for the user. Which isn't very friendly.
That's actually a better argument than it might seem like, but, as I wrote in my root node update, if you don't write separate mutators, but rather a single central property setter method, you completely obviate the need for chaining to begin with:
$window->set( title => 'foo', border => 20 );
And I was almost going to point out that you were picking up the wrong widget in your rewrite of the chaining because the en passant assignment in
my $button = $window->child->border(20);
Really, don't mix these things. It seriously makes reading the code an excercise in frustration.
Makeshifts last the longest.