All processes have a process environment, containing environment variables.
In addition to that, shells have a local environment, containing local variables.
When you invoke an application, it inherits the process environment (containing the environment variables) from the shell, but not the local environment.
So if you are using a variable, and you want applications or commands that you execute to be able to see the variable as well, then you have to export it. Otherwise you don't.
It is important to note that if you start an application or command, it gets its own copy of the enivronment. Hence, you applications can never change any variables in your shell.