Оказывается, это было что-то еще.
Я попытался print(os.path.getsize(temp_file_path))
и получил правильный вывод, чтобы Python мог ясно видеть файл.
Как только я удалил двойные кавычки вокруг ввода ffmpeg, отфильтровал и вывел все, все работало нормально. Не уверен, как это возможно, но я полагаю, это особенность subprocess.run, которая автоматически очищает аргументы?
Для всех, кто хочет, вот окончательный вывод:
temp_file_path = "./0.mkv"
final_file_path = "./0hardsubs.mkv"
cmd = ['ffmpeg', '-i', f'{temp_file_path}', \
'-filter_complex', f'subtitles=\'{temp_file_path}\'', \
f'{final_file_path}', '-y', '-loglevel', 'warning', '-stats']
subprocess.run(cmd)