Standard actually says that search order is implementation defined. Every compiler can do whatever they want. So this is not specified in standard. Each compiler decides on its own what does that mean.
Afaik for GCC/Clang bracket include first looks up in paths specified by -I argument, then in folders specified by -isystem argument and then in other system specific places (configured at gcc compile time).
For quoted includes it first looks up folder where the file that has the #include statement is, then in folders specified by -iquote argument. If it doesn't find it there, then it tries to lookup in same way as for bracket includes.
For MSVC bracket includes first look up in /I argument, then in INCLUDE environment variable. Quoted include first look up in the folder where the file that has the #include statement is, then they follow bracket include order. Typically IDE or vcvars bat file sets up INCLUDE env variable for you (it contains C/C++ runtime headers and OS headers like windows.h).
There are other minor differences between MSVC and gcc/clang - for example, with relative paths. It's very tricky. Here's a video from LLVM 2015 conference that mentions it:
https://youtu.be/rXi065XC6zY?t=753 (description has slides, page 35).
OSX has additional fun with framworks - you can add them with "-F" which also modifies include path. Complete bananas.
And there is no single convention what people use. Some people use quoted includes for your own application/library and brackets for everything else (system includes, C/C++ runtime, third-party system library like libpng). Some people simply use quotes for everything, and that also works.