Конфликт времени жизни в замыкании. Почему?

А с чего он это взял?

C той сигнатуры, которую Вы ему скормили:

fn parse(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {

А именно - в использовании поля self.level. Но всё ещё не могу понять - почему?

Ну, self.level закреплен за тем же лайтайм-параметром, что и self (он ведь его часть). Само замыкание у Вас захватывает ссылку на self.level (это Fn замыкание), соотвественно является объектом, который ссылается на self.level, а значит не может пережить self. При этом это замыкание уезжает в parser, а результат parser.parse() должен не пережить некий лайфтайм 'a, с которым self у Вас никак не связан.

Вам надо пошаманить над сигнатуркой,

По идее, что-то типа этого должно сработать:

fn parse<'s, 'r: 's + 'a>(&'s self, in_string: &'a str) -> (Result<String, ()>, &'r str) {

Либо же избавиться в замыкании ссылки на self.level скопировав/склонировав значение и смувнув его в move || замыкание, тогда зависимости от self лайфтайма не будет.