A small update.
But before the update, let me clarify the original reason, why the expression `let a = assert false in fun x -> 1` is not generalized. The reason is because the `assert false` is not nonexpansive (sorry for the double negation). A nonexpansive value, in OCaml compiler parlance, is a value that has "no _observable_ side effects". The `assert false` is currently typed as a special expression, that is assumed to have a side effect (i.e., it is expansive). Thus, it is basically treated the same as `let a = print_int 1 in fun x -> 1` that is also not generalized, as the evaluation of the `print_int 1 in fun x -> 1` has some effect.
Apparently, the assumption that `assert false` is expansive was too conservative, as it was already subsumed (in some cases) with the value restriction relaxation. So it will be relaxed soon, see GPR#1142 [1]. And soon both of your functions will have the same type.