Since then I found that providing an absolute path to fs.watch on Mac works if the path is outside (not a descendant of) the original current working directory for the process.
If the path is inside or equal to the original current working directory of the process, then providing an absolute path does not work (fs.watch returns no events for changes). In this case, providing the shortest possible relative path will work, or "." for the current working directory.
Using process.chdir makes no difference, it's the original current working directory that is taken into account.
Also, it seems like fs.watch on Mac on a directory always includes changes in subdirectories regardless of whether recursive is true or false.