An alternative to matching on the result of a recursive call is to write a helper function with an accumulator argument:
let remove_first elt list =
let rec loop acc = function
| [] -> None
| x::xs ->
if x = elt then Some (List.rev_append acc xs)
else loop (x::acc) xs in
loop [] list
A minor advantage of doing it this way is that the loop becomes tail recursive.