Replacing values in a list
I'd replace the ArrayList with a hashtable for faster lookup and less code. Replace:

$csv = Import-Csv $csvFileName
$subWeb = get-spweb -identity "$sharePointWebUrl"     
$mylistitems = $subWeb.Lists["MyList"].Items | sort Title

$csvCollection = New-Object System.Collections.ArrayList
$csv | ForEach-Object {
        $temp = "" | select "Topics", "Column1"
        $temp.Topics = $_.Topic
        $temp.Column1 = $_.NewTopic
        $csvCollection.Add($temp) | Out-Null
}

try
{
        foreach ($li in $mylistitems) {
                $loopcount=0
                :loop foreach ($si in $csvCollection) 
                {
                    $loopcount =$loopcount + 1
                    if ($li["Topics"] -eq $si.Topics)
                    {
                        $li["Topics"] = $si.Column1
                        $isFound =$true
                        $li.Update()
                        break loop
                    }
                }
        }           
}


With:

#Create hashtable for topics to update
$TopicUpdates = @{}
Import-Csv $csvFileName | ForEach-Object {
    #Assuming you only have one line per Topic (old value) as hashtable keys needs to be unique        
    $TopicUpdates[$_.Topic] = $_.NewTopic
}

$subWeb = get-spweb -identity "$sharePointWebUrl"     
$mylistitems = $subWeb.Lists["MyList"].Items | Sort-Object Title

try
{
    foreach ($li in $mylistitems) {

        if($TopicUpdates.ContainsKey($li["Topics"]) {
            #Found Topic in hashtable - Updating
            $li["Topics"] = $TopicUpdates[($li["Topics"])]
            #Not sure what this variable is for
            $isFound = $true
            $li.Update()
        }
    }           
}


You should also cleanup your try/catch-design. There's no need for the inner try/catch as it does exactly the same as the parent try/catch.