Right, so for instances using storage pools that support the optimized image storage feature (zfs, btrfs, lvm thin, and ceph) the first time an image is used it is unpacked into an image volume on the specific storage pool where the instance will be located. Then a writable snapshot of that image volume is taken that will be used as the root disk for the instance. Subsequent instances created using that image will just take another writable snapshot of that existing image volume. In that way it is quicker to launch future instances because the unpack operation only has to occur once.
However if you’re using a storage pool that doesn’t support optimized image storage (dir, lvm non-thin) then the image is unpacked for every instance, so it needs to be kept around. Additionally, if you create a new storage pool, or the image volume gets removed from the storage pool, then it will use the downloaded file to (re-)create image volumes by unpacking it again.
If space on the root filesystem of the host is a problem, you can instruct LXD to store the compressed image files that are downloaded on a custom volume (which isn’t the same as an image volume) on the storage pool you choose.