This is a very normal way of going about it, with the one correction that a sequence from a map is a sequence of pairs [key value] rather than just the keys, so your filter function needs to use the key explicitly
user> (defn dissoc-by [f m] (->> m (filter #(f (first %))) (into {})))
#'user/dissoc-by
user> (dissoc-by #(.contains % "good") m)
{"good1" 1, "good2" 2}
If you would like to get fancy about it and use a transducer this function can be made more efficient by eliminating the intermediate sequences that are allocated to move data from one step to the next.
user> (defn dissoc-by [f m]
(into {} (filter #(f (first %))) m))
#'user/dissoc-by
user> (dissoc-by #(.contains % "good") m)
{"good1" 1, "good2" 2}
into
takes an optional middle argument, a transducer function, that can filter or transform the data as it is pored into the collection.