EPVs are used to bind centrally defined variables of different types to BPDs and services, they can be changed at run time and are meant to provide simple means of interjecting into a running process service before its next lookup of the EPV variable. A good example will be to enable/disable a maintenance application not available state.
Environment variable on the other hand (can also be changed at run time though) are more geared towards storing a set of parameters e.g. web service hostname per environmement (DEV, SIT, QA, PROD), you can store things like jndi names, java application integration urls, environment identifers themselves, email sender addresses, admin groups etc.
Environment variables are akin to java property files which make the exact same code deployable to different environments.