There are three ways a Pod reads a ConfigMap. First, as environment variables: you map individual keys to env vars, or pull every key in at once with envFrom. Second, as command-line arguments built from those env vars. Third, mounted as a volume, where each key becomes a file and the value becomes the file contents inside the container.
The mount method matters because of how updates behave. Environment variables are read once when the container starts, so changing the ConfigMap does nothing to a running Pod, you have to restart it. A mounted volume is different: the kubelet periodically syncs the files, and an updated ConfigMap propagates into the volume on its own, typically within about 60 to 90 seconds. Your application still has to notice the changed file and reload, since Kubernetes only updates the bytes on disk.
One sharp edge: if you mount a single key using subPath, that file will not update when the ConfigMap changes. Only full-volume mounts get live updates. ConfigMap data is also stored in etcd and is capped at 1 MiB per object, because etcd is built for small metadata, not large blobs.