Как сказал Грег, проблема заключалась в фундаментальном неправильном понимании функции замены с моей стороны.
"То есть она должна заменить все совпадение. Re.sub () не заботится о группах внутри ваш шаблон. Он просто заботится обо всем шаблоне (ie. все совпадение). "
Я закончил тем, что изменил свое регулярное выражение на: ^(<Directory\s*\"\/var\/www\/html\">.*?AllowOverride\s*)(None)(.*?<\/Directory>)$
и выполнил замену как итак:
#!/usr/bin/python
import re
pattern = r"^(<Directory\s*\"\/var\/www\/html\">.*?AllowOverride\s*)(None)(.*?<\/Directory>)$"
repl = r"\g<1>All\g<3>"
with open('httpd.conf', 'r') as io:
string = io.read()
o = re.sub(pattern, repl, string, count=1, flags=re.M|re.S)
print(o)