When $wgUseAjax is false, the watch link on a page computes a token using WatchAction:getWatchToken(). The $salt used to create the token uses $title->getPrefixedDBkey();
When you follow the link, WatchAction:show() calls $user->matchEditToken() to validate the token passed, but show() uses $this->getTitle()->getDBkey() for its $salt.
getPrefixedDBKey() and getDBKey() are not the same, so the token fails to validate, and you can't watch or unwatch pages.