The core always return $this; in the context of observer methods - but there doesn't actually appear to be a reason for it.
Tracing back through dispatchEvent() you'll find the main method that calls observer methods (in ./app/Core/Model/App.php)
protected function _callObserverMethod($object, $method, $observer) { if (method_exists($object, $method)) { $object->$method($observer); } elseif (Mage::getIsDeveloperMode()) { Mage::throwException('Method "'.$method.'" is not defined in "'.get_class($object).'"'); } return $this; }
But at no point is the return value ever actually used or referenced to be passed into another observer down the chain.
Perhaps Magento were thinking longer term to use it as some means to retain/pass data within $this class instance outside of using sessions/registry; or it could have been legacy code that has just stuck.
I can't see a compelling reason to return $this - but that being said, if they do it in the core, that's what we do.
As a general rule, whatever the core does - we deem best practice. With the exception of the shocking spelling mistakes :)