AFAICT real responses have a length-0 raw body if there is no content, not ever NULL (what response() has for its default).
library(httr2)
out <- request("http://httpbin.org/status/204") %>% req_perform()
out$body
#> raw(0)
Created on 2021-12-31 by the reprex package (v2.0.1)