Svelte Store. Spread syntax is not merging - just adding

val = [...val,newBasket]

With this line you're copying the previous store value and adding the newBasket "on top". That's how the spread operator works with arrays

let arr = [1,2,3]
let n = 4

let arr2 = [...arr, n]

console.log(arr2) // [ 1 , 2 , 3 , 4 ]

I wonder if you might have thought of the different behaviour when spreading an object, where an already existing entry might be overriden if the key already exists

let obj = {key: 'value'}
let key = 'newValue'

let obj2 = {...obj, key}

console.log(obj2) // { key: "newValue" }

To make your code working you could replace the line by val[basketIndex] = newBasket

export const add = (item,basketIndex) => { 
    storeBaskets.update(val => {        
        const newItems = [...val[basketIndex].items, item]
        const newBasket = {'name':val[basketIndex].name,'items':newItems}
        val[basketIndex] = newBasket
        return val
    })
}

Or, instead of spreading, simply push the new value directly to the according nested array in just one line

export const add = (item,basketIndex) => { 
        storeBaskets.update(val => {        
        val[basketIndex].items.push(item)
        return val
    })
}

You might not need to spread, because it's an array, you'r spreading the existing items of the array and then adding the new basket to it. You can map and replace by basketIndex, like:

export const add = (item,basketIndex) => { 
        storeBaskets.update(val => {
         const newItems = [...val[basketIndex].items, item]
         const newBasket = {'name':val[basketIndex].name,'items':newItems}
         
        return val.map((basket, i) => i === basketIndex ? newBasket : basket)
    })
}

(Working example)