First, let me offer a practical solution: instead of changing Mathematica's behaviour, define a function that will do this for you.
export[file_String, rest___] :=
Export[FileNameJoin[{NotebookDirectory[], file}], rest]
What you ask (i.e. that programmatic exporting goes to the notebook's directory by default) is not reasonable, as it is not compatible with how Mathematica (and all comparable programs) work. It breaks a fundamental analogy/metaphor/concept (whatever you want to call it) that helps us think about file system organization. Mathematica, like basically everything other similar system, uses the concept of a "current directory". You can think of the filesystem as a "space" that you move through. The current directory is where you are standing right now. Anything do you happens here.
Notebooks are not isolated from each other. It makes no difference which notebook you are running code in. They all see the same system state (i.e. kernel state). Thus they all share the same working directory.
The "Mathematica kernel" is the program that does all the computation and holds the system state. If you define a variable or function, they live in the kernel process's memory. Normally, there is one kernel running, shared by all notebooks. It is the kernel where your work lives and where your program runs, so it is the kernel that defined "where you are located" in the filesystem.
You could start a different kernel for each notebook, but you would soon run out of licenses. This would also prevent any sharing of information between notebooks. If a variable is defined in one notebook, it will not be visible in another.
Of course, all this does not mean that there are no practical workarounds to exporting to the same directory where the notebook is saved: see the export
function at the beginning of my post. Clearly, wanting to do this is reasonable and useful.