That should work using QGIS' contour tool (Raster -> Extraction -> Contour), with contours being interpolated where necessary. This tutorial should cover the workflow in case you're new to this.
You could try and split your contours into multiple extracts, e.g. 5 layers with 100m intervals, consecutively starting every 20m (0 - 80m), if loading a single file is too slow (or reaches file size limits, depending on your output format). If the data is provided in a grid of connected files, don't merge them and extract the contours per file. This might cause jumps between contours at the layers' edges but lets you choose which layers to display
However, the amount of created features will indeed be massive and creating/using these layers within any GIS might be a large pain in the. Depending on your application, it might be worth considering to use a database like PostgreSQL/PostGIS to be able to query only those features necessary to work with (by bounding box or sth. similar).
I wrongly assumed the Contour tools' GUI would offer an offset option (wasn't it there in some versions?). QGIS uses the mighty GDAL under the hood for raster calculations, and here, the gdal_contour module in particular.
At the bottom of the GUI window you see the exact command that is executed. You can edit the command via the edit button: adding -off <offset_in_m_from_0> to the commands options will do the trick.
Alternatively you can run that command directly from your OS terminal/console (GDAL is shipped with your QGIS installation, look for the gdal_contour.exe and open your terminal there to be able to use it)
Perhaps generating seamless 20K contours over such a large area is not necessary if the contours are only going to be used for static mapping of features at scales ~20k.
If this is the case, then the solution is to find a cartographically meaningful sub-unit and to clip the input DEM into smaller pieces. IF you are producing maps of fish bearing streams, for example, you might clip your DEM (and therefore contours) into the shape of smaller watersheds.
The steps for this answer then would be:
Find a cartographically meaningful sub-unit to clip your contours to.
Use shapefiles of these feature to clip your DEM into manageable units.
Use these smaller DEM files as input into the Contour Tool (Raster>Extraction>Contour).