One way is as follows. It is important that the code is inserted into Manipulate[] without being evaluated. Note the use of Hold and OwnValues.
In a file, say "/tmp/body.wl" or better yet, https://pastebin.com/raw/TbzQYHqz:
body = Hold[ b = Sin[aa*n #] &; Plot[b[f], {f, fmin, fmax}] ];
In another file, say "/tmp/controls.wl" or better yet, https://pastebin.com/raw/0bt8a6x7:
controls = Hold[ {fmin, 0, 1}, {fmax, 2, 3}, {n, 1, 5, 1} ];
Then
Clear[body, controls]; fmin = -1; (* to show global definitions do not affect the result *) b = 0; (* ditto, but this is overwritten when /tmp/body.wl is read in *) aa = 2; (* a global variable used in body *) << "https://pastebin.com/raw/TbzQYHqz"; (* read in body *) << "https://pastebin.com/raw/0bt8a6x7"; (* read in controls *) Hold[ body, controls] /. OwnValues@body /. OwnValues@controls // Flatten // Apply[Manipulate]

If you want something more complicated as shown in your example, then things get more intricate, depending on how much variation you want to be able to handle. For instance, moving Plot[..] out of the definition of body:
body = Hold[ b = Sin[aa*n #] & ]; Hold[ body, Plot[b[f], {f, fmin, fmax}], controls] /. OwnValues@body /. OwnValues@controls /. Hold[Hold[b1_], b2_, Hold[c___]] :> Manipulate[b1; b2, c]
Manipulatemoves in mysterious ways. $\endgroup$