Цикл довольно прост, и я не уверен, что вы можете сделать намного лучше. Возможно, вы сможете микрооптимизировать порядок выражения в операторе if. Например, из-за короткого замыкания символа && может быть быстрее упорядочить оператор if таким образом
if (mask[index]!= word[index])) && (mask[index] != ' ')
Предполагая, что совпадающие символы встречаются чаще, чем совпадающие символы подстановки. Конечно, это всего лишь теория, и я бы не поверил, что она имела значение, если не сравнивать ее.
И как уже отмечали другие, процедура не выполняется, если маска и строка имеют разную длину.