I believe that the most common solution is have independent build directories for each compile mode (options).
I mean that you need create two directories for this purpose (if your source code stored in ProjectSrc):
ProjectSrc  
└── CMakeList.txt  
ProjectBuild_Debug  
ProjectBuild_Release  
Inside ProjectBuild_Debug you need call:
cmake -DCMAKE_BUILD_TYPE=Debug ../ProjectSrc
And Inside ProjectBuild_Release you need call:
cmake -DCMAKE_BUILD_TYPE=Release ../ProjectSrc
Now you can rebuild any type of your program and only files which was changed will be recompiled.
everything is recompiling - everything is recompiling because each file must be compiled with specified compiler options and it's necessary.
Let's look together. For example our project, which build executable file program.exe consist from two source files: one.cpp and two.cpp, both of them have debug output.
- You build with 
release options:
one.o and two.o. 
- You change file 
one.cpp and rebuild with debug . Now if CMake rebuild only changed files you will get situation when you expect debug version of your program.exe with correct debug output, but it is not, because debug output in file two.o was disabled according last time compilation options.