Строка false, разумеется приводится к true.
В РНР будет ровно то же самое, условие if('false') выполнится.
А чтобы false воспринималось как булево значение, а не как строка, надо либо сказать твоему яваскрипту, что он ждёт специальным образом кодированные данные, либо РНР - что он отправляет не HTML, а некий другой формат.
В общем, обилие комментаторов с советами вида "пальцем в небо" наглядно показывает уровень понимания средним пользователем похапе своих действий.
В целом направление мысли верное - система воспринимает переданное значение как строку, а не как булево значение. Но на этом мысль и останавливается.
Хотя при некотором усилии можно было бы продолжить и рассудить - что поскольку протокол НТТР чисто текстовый, то никакие булевы значения через него по умолчанию передать нельзя. А так же объекты, массивы, и прочие типы данных.
И для того чтобы сделать это возможным, был придуман специальный формат кодирования. Который позволяет передавать данные различнызх типовв, и который автор, несомненно, уже применяет (вследствие чего, собственно, из булева значения и получается строка false
).
То есть единственным недостающим звеном в этой головоломке является контекст, в зависимости от которого яваскрипт будет воспринимать строку false либо как строку, либо как булево значение. То есть нужен способ РНР и яваскрипту договориться, в каком формате они обмениваются данными. Стандартным способом является НТТР заголовок Content-type. Который скажет браузеру, что данные не в дефолтом формате HTML, а в другом.
Либо как вариант, можно прямо при вызове функции ajax явно задать, в каком формате придут данные. Если озаботиться изучением документации по этой функции.