The job of Event Loop is to monitor & process both stack & callback queue. It will check if stack is empty or not. If stack is processing some code, it won’t do anything. In case stack frame is empty, Event Loop will poll Callback Queue. If any completed event is there, it will push the related function back on the stack. And JS engine will execute the function from the stack.
We talked about Google Chrome browser here. We could have very well talked about NodeJS runtime. We would have just replaced Web APIs with some C++ libraries to support asynchronous callbacks. Flow would have remained same.