There's no need to advise functions.
M-x info-apropos buffer-list gives us a link to this info node: The Buffer List.
This paragraph in particular offers a solution:
To change the order or value of a specific frame’s buffer list, set
that frame’s ‘buffer-list’ parameter with ‘modify-frame-parameters’.
There isn't a
with-frame-parameters as far as I know, but we can monkey-wrench one pretty easily:
(defmacro clean-buffer-list (&rest body)
"Remove all entries from the current frame's buffer-list parameter
that match the regex, \" ?\\\\\\*\"; update the parameter, and then
execute BODY in a `progn'. Note that this permanently modifies the
frame's buffer-list as a side effect."
(declare (indent defun)
`(let ((buffers ',(cl-loop for x in (frame-parameter nil 'buffer-list)
unless (string-match (rx (: (? " ") "*")) (buffer-name x))
collect x into rs
finally return rs)))
(set-frame-parameter nil 'buffer-list buffers)
I tested it like this:
M-x buffer-menu <RET>
(other-buffer) ; returns "*Buffer List*"
(clean-buffer-list (other-buffer)) ; returns "a.el"
The *-buffers still live on in the fundamental buffer-list, but I'm not sure how to access them, and I think that's beyond the scope of this question. The linked info page should give you some pointers if that's what you need. The macro right now might also cause some wonky behaviour if you're calling it from within a *-buffer; I haven't tested that extensively.