The reason your output on the second get is the same is because of parse order. If you set that get to run later with process="end" it should show the combined result:
{exp:stash:set
name="recently_viewed_ids"
parse_tags="yes"
trim="yes"
}
{exp:channel:entries channel="blog" dynamic="no" backspace="1"}{entry_id}|{/exp:channel:entries}
{/exp:stash:set}
Result 1: {exp:stash:get name='recently_viewed_ids'}
<hr>
{exp:stash:append
name="recently_viewed_ids"
parse_tags="yes"
trim="yes"
}
{exp:channel:entries channel="business" dynamic="no" backspace="1"}{entry_id}|{/exp:channel:entries}
{/exp:stash:append}
Result 2: {exp:stash:get name='recently_viewed_ids' process='end'}
Also, the first set doesn't need to be an append, and the second set needed a parse_tags parameter. The get also only needs a single tag not a tag pair, because it isn't set as a stash list.
UPDATE:
Setting the ids as a list:
{exp:stash:set_list
name="recently_viewed_ids"
parse_tags="yes"
}
{stash:ids_1}{exp:channel:entries channel="CHANNEL_1" dynamic="no" backspace="1"}{entry_id}|{/exp:channel:entries}{/stash:ids_1}
{stash:ids_2}{exp:channel:entries channel="CHANNEL_2" dynamic="no" backspace="1"}{entry_id}|{/exp:channel:entries}{/stash:ids_2}
{stash:ids_3}{exp:channel:entries channel="CHANNEL_3" dynamic="no" backspace="1"}{entry_id}|{/exp:channel:entries}{/stash:ids_3}
{/exp:stash:set_list}
Result 1: {exp:stash:get_list name='recently_viewed_ids'}{ids_1}{/exp:stash:get_list}
<hr>
Result 2: {exp:stash:get_list name='recently_viewed_ids'}{ids_2}{/exp:stash:get_list}
<hr>
Result 3: {exp:stash:get_list name='recently_viewed_ids'}{ids_3}{/exp:stash:get_list}
<hr>
Result 1+2: {exp:stash:get_list name='recently_viewed_ids'}{ids_1}|{ids_2}{/exp:stash:get_list}
<hr>
Result 1+2+3: {exp:stash:get_list name='recently_viewed_ids'}{ids_1}|{ids_2}|{ids_3}{/exp:stash:get_list}