After done editing, I exported only to see that audio and video do not sync. I know what the problem is - the project's video strips have a variable frame rate. But is there a way to make Blender sync them despite that? I don't want to encode every clip that I have with a CFR.
Blender does not allow you to decode variable frame rates. Sorry, this is because Blender is only aware of one frame at a time and expects to play 1 frame per frame. In other words it is temporaly blind (can't look ahead) and doesn't understand that you may want to hold the current frame for a period of time. You'll have to transcode to a compatible Codec to use the VSE in sync with audio.
When I have had to deal with variable-frame-rate video I use ffmpeg to render it to PNGs at a fixed frame rate.
ffmpeg -i screencap.mp4 -vf fps=30 $(OD1)/%04d.png
ffmpeg will "resample" the video temporally, probably duplicating some frames. It might even drop frames if your source video has some really short inter-frame intervals. Just pick
fps= to match the rate of your VSE project to make your life easy.
Once you have the PNG sequence you can use that as the source for your VSE strip.
edit: Since you have mentioned you have a large library of clips, I would create a makefile
/var/tmp/cfr/%/0001.png: %.mp4 ffmpeg -i $< -vf fps=30 /var/tmp/cfr/$*/%04d.png
Alternately, you could have a shell script that iterates through the video files to perform the conversion
for f in "$@"; do d=/var/tmp/cfr/$(basename $f .mp4) ffmpeg -i $f -vf fps=30 $d/%04d.png