作ってみた。あんまりテストしてないけど。

(defvar line-breakable-char-list '(?、 ?。))

(defun break-paragraph ()
(interactive)
(let* ((old (category-table))
(new (copy-category-table old)))
(map-char-table (lambda (char category-set)
(when (and (aref category-set ?j)
(not (memq char line-breakable-char-list)))
(aset category-set ?| nil))) new)
(set-category-table new)
(unwind-protect
(save-excursion
(let ((end (progn (forward-paragraph) (point))))
(backward-paragraph)
(replace-regexp "\\(\\cj\\)\n\\(\\cj\\)" "\\1\\2" nil (point) end)
(fill-paragraph nil)))
(set-category-table old))))