NIO просто означает Новый IO. Это расширенный общий пакет Java IO, который имеет большую поддержку асинхронного ввода-вывода, но также содержит довольно много других улучшений, таких как поддержка поиска по именам файлов. Вы бы использовали его, когда пытаетесь сделать что-то, что не поддерживается классами в java.io.
JMS - это система обмена сообщениями Java. Вы можете использовать его, когда вам нужно, чтобы два приложения общались друг с другом через систему, похожую на очередь. Независимо от того, использует ли он NIO под капотом, это деталь реализации, хотя, вероятно, это делают различные провайдеры JMS, написанные на Java.