In short - he is using unity build. Unity build means that compiler will compile only one file. This one file will have everything that your program needs - all the defines, all standard includes, all the functions, all the structures and all the global variables. So how he organizes .h and .cpp files is pretty irrelevant - he just puts stuff in them only to make compiler happy (so compiler sees every declaration for the code that needs it above).
He actually uses header guards. #ifndef style.
He includes header in source file. Maybe sometimes he forgets it, but everything still works because of unity build.
Defining some functions in header file is actually pretty common in and needed feature. You need to do that if you want compiler to potentially inline it in other translation unit (unless you enable link time code generation optimization).
In C/C++ splitting stuff between h and cpp file is not required from compiler point of view. It's just that people do that because either they are told to do that, or because its sometimes easier to organize stuff like that. But from compiler point of view there is only one file - called translation unit - that you pass to compile. I recommend you to watch Chat 13 episode where Casey talks about .cpp and .h files and how compiler operates on them: https://hero.handmade.network/episode/chat/chat013
It should explain you these things pretty well.
As for multiple include guards, you don't need them in a properly constructed unity build because you don't have circular includes.
Include guards are not only for circular includes. But for multiple includes (A includes B, but C includes A and B).
Each file should have a dependency only on files that are included before it.
This is not always possible. For example, because of recursion - you need to forward declare something, and sometimes that happens between multiple "header/cpp" files.