How do you handle this in emacs, since the main idea behind emacs is that you use one window for everything.
This isn't quite the main idea behind emacs. You can always run multiple emacs processes simultaneously and you will get a window for each project. This plays well will neotree, projectile, speedbar etc.
In a mac, if you launch emacs from GUI, the OS will switch you to the already running instance. But you can always create multiple processes from the terminal.
I however, prefer to have a single window for multiple projects when using emacs. I use projectile, helm and neotree for navigating through projects and files. Projectile allows me to configure the project root. So I typically have multiple repositories under a single parent directory which is designated as projectile project root. So as far as projectile is concerned it is dealing with a single project and features that are intended to work on a whole project (eg. find files in a project or grep in a project) work exactly as expected.