readFile читает файл целиком и отдает контент в callback-функцию. Подходит для небольших файлов, либо для типов файлов, не поддерживающих поточное чтение (например, нужна гарантия целостности всего содержимого). Плюс, так как весь контент хранится в переменной, то все содержимое файла будет в памяти.
createReadStream создает объект FileStream и дает возможность читать файл по частям. Соответственно, в памяти будет только текущий кусок. Например, можно обратывать так XML или JSON. Или отдавать файл по сети.
С записью все по аналогии.
P.S. И JSON и XML поддерживают поточное чтение, но при этом файл может быть неконсистентным, например, поврежденным в конце.
Upd. Ответ исправлен по замечанию @Smlnc и
Алексей Тен