It is not that simple. I used to write trainers until very recently. With recent games it is very difficult to find the memory locations and alter it as they usually randomize the location. However we can inject a DLL into the original game process (there are many methods to do this). Once that is done, the DLL is running within the same address space as the host process and you can access any memory location and even call functions within the host process (if you know the memory address and parameters).
Another way is to alter one of the DLLs the game usually loads. Most use the d3dxxx.dll. This altered DLL can then load additional files that the cheater wants. GTA’s ASI loader works this way as far as I know.
What I am trying to say is in these situations it is impossible for the OS to block memory access. How does the OS know if the access is coming from the original DLL or altered DLL and for what purpose.