У тебя выражение
a == 'Hi' or 'hi' or 'Hello' or 'hello'
вычисляет совсем не то, что ты думаешь.
Сначала вычисляется выражение
a == 'Hi'
Допустим, в переменной 'a' лежит фраза "незнаю, не играл" или "я дундук", что, в принципе, - синонимы. Тогда это сравнение даст False.
Тогда будет вычисляться следующий операнд or, и он выдаст 'hi', которое в переводе в логическое значение будет считаться True (потому что это - непустая строка). И на этом условие if выполнено.
Сравнить строку на принадлежность списку можно так:
if a in { 'Hi', 'hi', 'Hello', 'hello' }:
Здесь 4 строчки упакованы в множество, а поиск по множеству выполняется эффективнее, чем по списку.
Или можно сделать ещё короче, и заодно захватить все возможные комбинации регистра (hI, HI, hEllO и т.п.):
if a.title() in { 'Hi', 'Hello' }:
А условие цикла - заведомо не имеющее смысла. Либо проверяем в условии всю эту кухню с 'Hi' и 'Hello', либо делаем бесконечный цикл, а выход - через break:
while True:
a = input()
if a in { 'Hi', 'hi', 'Hello', 'hello' }:
print('Greetings to you!')
else:
break
(и тогда a = 1 в начале программы - не нужно)