map は普通に map に渡す関数を async にしたら Promise の配列になるので Promise.all するだけ

const items = [10, 20, 30]
const asyncDiv5 = num => new Promise(resolve => setTimeout(resolve, 100, num / 5))

await Promise.all(items.map(asyncDiv5))
// [2, 4, 6]

reduce も返り値が Promise でも次の関数に渡されるのが Promise なだけだから次の関数が前回の値を await して使えばいい

const values = [1, 2, 3, 4]
const getValue = x => Promise.resolve(x * 10)

await values.reduce(async (a, b) => (await a) + (await getValue(b)), 0)
// 100

問題は渡した関数の返り値の値をコレクションメソッド内部で扱う場合
これらは Promise に対応してないので Promise を解決せずそのまま Promise 自体を結果として扱う
なので filter の場合だと Promise オブジェクトはオブジェクトなので true になって全部が残るし find でも最初のが絶対マッチする

console.log([1, 2].filter(async x => false))
// [1, 2]

console.log([1, 2].find(async x => false))
// 1

filter に対応するならこういう一度 Promise の中身を取り出す処理が必要になる

const filter = async (arr, fn) => {
const filter_flags = await Promise.all(items.map(fn))
return arr.filter((_, i) => filter_flags[i])
}

この処理を毎回直接書くのは避けたいくらいので filter 関数を自作することになる
標準で用意してくれればいいのに

const items = [0, 1, 2, 3, 4]
const fn = x => {
if(x === 0) return false
if(x === 1) return true
if(x === 2) return new Promise(r => setTimeout(r, 1000, true))
if(x === 3) return Promise.resolve(false)
if(x === 4) return Promise.resolve(true)
}

await filter(items, fn)
// [1, 2, 4]